2012-12-11 26 views
7

我正在運行一個應用程序,該應用程序在多個子域usergroupXYZ.onruby.de上運行,並且還支持任意域作爲別名。所以您可以通過yourusergroup.onruby.de或通過customdomain.de訪問域。具有多個域的github oauth

該應用程序通過twitter oauth和github oauth2提供登錄。

問題是,我沒有找到一種方法來支持通過自定義域的github auth。我總是從github獲得redirect_uri_mismatch錯誤。

twitter auth在重定向到不同的域時沒有問題。

除了爲每個自定義域創建github應用程序令牌外,沒有人有解決此問題的方法嗎?

回答

9

您可以覆蓋回撥URL,但它必須與OAuth應用程序設置中的主機名相匹配。本文檔提供了好的和不匹配的匹配列表:http://developer.github.com/v3/oauth/#redirect-urls

由於允許不同的上下文,因此一種解決方案是在基本回調URL上創建不同的上下文,然後使用上下文信息重定向到特定的主機。這意味着你會像'經紀人'一樣行事,並需要將一些信息傳遞給目標主機。

如果您的回撥URL是oauth.onruby.de,那麼根據Github,oauth.onruby.de/cust1oauth.onruby.de/cust2將是有效的。然後,您可以將/cust1重定向至cust1.de/cust2cust2.de

請注意,oauth.onruby.de將充當網關或代理商,並且需要確保沒有安全風險。

+0

會檢查出來 – phoet

1

是的,我們做了Akber建議的。我們有兩個網站,xxx.comxxx.co.uk,我們希望爲兩個網站OAuth使用一個github應用。

我們使用了Rails和OmniAuth寶石。

我們需要做的第一件事是追加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回調

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 
重定向