GitHub OAuth 多域名支持

9
我正在运行一个应用程序,该应用程序在多个子域(usergroupXYZ.onruby.de)上运行,并支持任意域名作为别名。因此,您可以通过yourusergroup.onruby.de或customdomain.de访问该域。
该应用程序提供Twitter OAuth和Github OAuth2登录功能。
问题是,我无法找到一种支持自定义域名的Github身份验证方式。我总是从Github收到“redirect_uri_mismatch”错误。
Twitter身份验证没有将重定向到其他域的问题。
有没有人有解决这个问题的方法,而不是为每个自定义域创建Github应用程序令牌?
2个回答

11
您可以覆盖回调URL,但它必须与OAuth应用程序设置中的主机名匹配。此文档提供了一个好的和坏的匹配列表:http://developer.github.com/v3/oauth/#redirect-urls 由于允许不同的上下文,因此一种解决方案是在基本回调URL上创建不同的上下文,然后使用上下文信息重定向到特定的主机。这意味着您将像“代理”一样进行操作,并且需要向目标主机传递一些信息。
如果您的回调URL是oauth.onruby.de ,则oauth.onruby.de/cust1 oauth.onruby.de/cust2 将根据Github的规定是有效的。然后,您可以将/cust1 重定向到 cust1.de 并将/cust2 重定向到 cust2.de
请记住,oauth.onruby.de 将充当网关或代理,并且需要确保没有安全漏洞。

2

我们采纳了Akber的建议。我们有两个网站,xxx.comxxx.co.uk,我们想要使用一个Github应用程序来进行两个站点的OAuth。

我们使用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

这里是Rails中间件代码,当GitHub OAuth回调时执行重定向

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接