github oauth с множество домейни

изпълнявам приложение, което работи на няколко поддомейна usergroupXYZ.onruby.de и също така поддържа произволни домейни като псевдоними. така че можете да получите достъп до домейна чрез yourusergroup.onruby.de или чрез customdomain.de.

приложението осигурява влизане чрез twitter oauth и github oauth2.

проблемът е, че не намерих начин да поддържам github auth чрез персонализирани домейни. винаги получавам redirect_uri_mismatch грешки от github.

twitter auth няма проблем с пренасочване към друг домейн.

някой има ли решение на този проблем, различно от създаването на токен за приложение 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 gem.

Първото нещо, което трябва да направим, е да добавим 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