2012-12-11 18 views
7

Mam uruchomioną aplikację, która działa na kilku subdomenach usergroupXYZ.onruby.de, a także obsługuje dowolne domeny jako aliasy. aby uzyskać dostęp do domeny za pośrednictwem yourusergroup.onruby.de lub poprzez customdomain.de.github oauth z wieloma domenami

aplikacja zapewnia loginów poprzez twitter OAuth i github OAuth2.

problemem jest to, że nie mogę znaleźć sposób, aby wspierać GitHub uwierzytelniania za pomocą niestandardowych domen. zawsze otrzymuję błędy redirect_uri_mismatch od github.

świergot auth nie ma problemu z przekierowanie do innej domeny.

Czy ktoś ma rozwiązanie tego problemu innym niż tworzenie aplikacji tokena GitHub dla każdej domeny niestandardowej?

Odpowiedz

9

Można zastąpić URL wywołania zwrotnego, ale to musi być zgodna z nazwą hosta w ustawieniach aplikacji OAuth. Niniejszy dokument zawiera listę dobrych i złych meczów: http://developer.github.com/v3/oauth/#redirect-urls

Ponieważ różne konteksty są dozwolone, jednym rozwiązaniem byłoby stworzenie różnych kontekstów na podstawowy adres URL wywołania zwrotnego, a następnie użycie informacje kontekstowe przekierować do konkretnego gospodarza. Oznaczałoby to, że zachowałbyś się jak "pośrednik" i musiałbyś przekazać pewne informacje do docelowego hosta.

Jeśli callback URL oauth.onruby.de, następnie oauth.onruby.de/cust1 i oauth.onruby.de/cust2 będzie ważna według Github. Następnie można przekierować od /cust1 do cust1.de i /cust2 do cust2.de.

Należy pamiętać, że oauth.onruby.de działałby jako brama lub broker i musiałby się upewnić, że nie ma żadnych zabezpieczeń.

+0

sprawdzi to – phoet

1

Tak, zrobiliśmy to, co sugerował Akber. Mamy dwie witryny: xxx.com i xxx.co.uk. Chcemy użyć jednej aplikacji Github dla obu witryn OAuth.

Wykorzystaliśmy klejnoty Rails i OmniAuth.

Pierwszą rzeczą, jaką musimy zrobić, to dołączyć com lub co.uk na końcu adresu zwrotnego

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 

i oto kod szyny pośredniej że robi przekierowania gdy github OAuth oddzwania

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