github oauth с несколькими доменами

Я запускаю приложение, которое работает на нескольких поддоменах usergroupXYZ.onruby.de, а также поддерживает произвольные домены в качестве псевдонимов. так что вы можете получить доступ к домену через yourusergroup.onruby.de или через customdomain.de.

приложение обеспечивает вход через твиттер oauth и github oauth2.

проблема в том, что я не нашел способа поддерживать аутентификацию github через пользовательские домены. я всегда получаю redirect_uri_mismatch ошибки от github.

у авторизации твиттера нет проблем с перенаправлением на другой домен.

у кого-нибудь есть решение этой проблемы, кроме создания токена приложения github для каждого пользовательского домена?


person phoet    schedule 11.12.2012    source источник


Ответы (2)


Вы можете переопределить 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 будет выступать в качестве шлюза или брокера, и ему необходимо будет обеспечить отсутствие угроз безопасности.

person Akber Choudhry    schedule 12.12.2012

Да, мы сделали то, что предложил Акбер. У нас есть два сайта, xxx.com и xxx.co.uk, и мы хотим использовать одно приложение github для обоих сайтов OAuth.

Мы использовали Rails и гем OmniAuth.

Первое, что нам нужно сделать, это добавить com или co.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
person dalef    schedule 12.09.2015