2012-12-11 30 views
7

tôi đang chạy một ứng dụng chạy trên một số tên miền phụ usergroupXYZ.onruby.de và cũng hỗ trợ các miền tùy ý làm bí danh. để bạn có thể truy cập miền thông qua yourusergroup.onruby.de hoặc qua customdomain.de.github oauth với nhiều tên miền

ứng dụng cung cấp thông tin đăng nhập qua twitter oauth và github oauth2.

vấn đề là, rằng tôi không tìm thấy cách nào để hỗ trợ xác thực github thông qua các tên miền tùy chỉnh. tôi luôn gặp lỗi redirect_uri_mismatch từ github.

xác thực twitter không gặp sự cố khi chuyển hướng đến miền khác.

có ai có giải pháp cho vấn đề này ngoài việc tạo mã thông báo ứng dụng github cho mỗi miền tùy chỉnh không?

Trả lời

9

Bạn có thể ghi đè URL gọi lại nhưng phải khớp với tên máy chủ trong cài đặt Ứng dụng OAuth. Tài liệu này cung cấp danh sách các kết quả phù hợp tốt và xấu: http://developer.github.com/v3/oauth/#redirect-urls

Vì các ngữ cảnh khác nhau được phép, một giải pháp là tạo ngữ cảnh khác nhau trên URL gọi lại cơ sở và sau đó sử dụng thông tin ngữ cảnh để chuyển hướng đến máy chủ cụ thể. Nó có nghĩa là bạn sẽ hành động như một 'nhà môi giới' và sẽ cần truyền một số thông tin đến máy chủ mục tiêu.

Nếu URL gọi lại của bạn là oauth.onruby.de, thì oauth.onruby.de/cust1oauth.onruby.de/cust2 sẽ hợp lệ theo Github. Sau đó, bạn có thể chuyển hướng /cust1 đến cust1.de/cust2 đến cust2.de.

Hãy nhớ rằng oauth.onruby.de sẽ hoạt động như một cổng hoặc nhà môi giới và cần đảm bảo rằng không có phơi nhiễm bảo mật.

+0

sẽ kiểm tra xem – phoet

1

Đúng vậy, chúng tôi đã làm những gì Akber đề xuất. Chúng tôi có hai trang web, xxx.comxxx.co.uk và chúng tôi muốn sử dụng một ứng dụng github cho cả hai trang web OAuth.

Chúng tôi đã sử dụng đá quý Rails và OmniAuth.

Điều đầu tiên chúng ta cần phải làm là gắn com hay co.uk vào cuối URL callback

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 

và đây là mã ray middleware mà không chuyển hướng khi github OAuth gọi lại

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 
Các vấn đề liên quan