9

我正在运行一个在多个子域 usergroupXYZ.onruby.de 上运行的应用程序,并且还支持任意域作为别名。因此您可以通过 yourusergroup.onruby.de 或 customdomain.de 访问域。

该应用程序通过 twitter oauth 和 github oauth2 提供登录信息。

问题是,我没有找到通过自定义域支持 github auth 的方法。我总是redirect_uri_mismatch从 github 得到错误。

twitter auth 没有重定向到不同域的问题。

除了为每个自定义域创建一个 github 应用程序令牌之外,还有没有人可以解决这个问题?

4

2 回答 2

11

您可以覆盖回调 URL,但它必须与 OAuth 应用程序设置中的主机名匹配。本文档给出了好的和坏的匹配列表:http: //developer.github.com/v3/oauth/#redirect-urls

由于允许使用不同的上下文,一种解决方案是在基本回调 URL 上创建不同的上下文,然后使用上下文信息重定向到特定主机。这意味着您将像“经纪人”一样行事,并且需要将一些信息传递给目标主机。

如果你的回调 URL 是,oauth.onruby.de那么根据 Github 将是有效的。然后,您可以重定向到和。oauth.onruby.de/cust1oauth.onruby.de/cust2/cust1cust1.de/cust2cust2.de

请记住,oauth.onruby.de它将充当网关或代理,并且需要确保没有安全风险。

于 2012-12-12T14:29:23.710 回答
2

是的,我们按照 Akber 的建议做了。我们有两个站点,xxx.com并且xxx.co.uk我们想为两个站点 OAuth 使用一个 github 应用程序。

我们使用了 Rails 和 OmniAuth gem。

我们需要做的第一件事是追加comco.uk到回调 URL 的末尾

class OmniAuth::Strategies::GitHub
  # Some code are omitted    

  def callback_url
    url = super
    matches = url.match(/xxx\.([a-z|\.]+)(:\d+)?\//)
    if matches && matches[1] != 'com'
      tld = matches[1]
      url.gsub!("xxx.#{matches[1]}", 'xxx.com')
      url << "/#{tld}"
    end

    url
  end
end

这是在 github OAuth 回调时重定向的 rails 中间件代码

def call(env)
    match = env["PATH_INFO"].match(/\A\/users\/auth\/github\/callback\/(.+)\Z/)
    if match
      host = env["HTTP_HOST"]
      [301, {"Location" => "#{env['rack.url_scheme']}://#{host.gsub('com', match[1])}/users/auth/github/callback?#{env["QUERY_STRING"]}"}, self]
    else
      @app.call(env)
    end
end
于 2015-09-12T21:41:09.423 回答