2016-03-10 25 views
6

Tôi đang sử dụng Devise 3.5 với Omniauth trong ứng dụng Rails 4. Tôi đã tạo một tích hợp với Facebook cho phép người dùng kết nối tài khoản Facebook của họ với ứng dụng của tôi. Hiện tại khi người dùng nhấp vào nút kết nối, họ sẽ được gửi đến /user/auth/facebook và sau đó được chuyển hướng đến url gọi lại mà Omniauth tạo: /user/auth/facebook/callback. Những gì tôi muốn làm là ghi đè theo cách thủ công url gọi lại này trong một số trường hợp - có nghĩa là tôi không muốn ghi đè nó trong trình khởi tạo - với một địa chỉ đầy đủ đủ điều kiện. Ví dụ: nếu người dùng bắt đầu trên http://www.example.com/ Tôi có thể muốn ghi đè url gọi lại mặc định bằng http://app.example.com/user/auth/facebook/callback.Ghi đè/bỏ qua địa chỉ mặc định Url mặc định

Ứng dụng của tôi có tên miền phụ động và người dùng sẽ (hầu như) luôn bắt đầu quy trình xác thực trên tên miền phụ. Rất tiếc, có vẻ như Facebook không hỗ trợ các ký tự đại diện trong url chuyển hướng oauth, đó là lý do tại sao tôi muốn khả năng phát hiện xem người dùng có đang ở trên tên miền phụ hay không và điều chỉnh url gọi lại cho một cái gì đó mà tôi đã đưa vào danh sách trắng trên ứng dụng Facebook của mình để ủy quyền quá trình thành công.

Từ nội dung tôi đã đọc, trình trợ giúp url omniauth_authorize_path chấp nhận các đối số bổ sung được chuyển thành tham số. Tôi đã thử đi qua một con đường gọi lại tùy chỉnh trong như vậy, nhưng không thành công:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback) 

Tôi cũng đã cố gắng thay đổi callback_path-redirect_urlredirect_uri, nhưng không có vẻ làm việc. Khi tôi nhìn vào liên kết được tạo ra, nó thực sự bao gồm gọi lại như một tham số trong url, nhưng khi tôi nhấp vào liên kết, tôi được chuyển hướng trở lại url gọi lại mặc định thay vì url gọi lại tùy chỉnh.

+0

Tôi cũng cần tính năng đó: ( – diogopms

Trả lời

0

Đây là cách tôi giải quyết vấn đề này. Tôi chắc chắn có nhiều cách khác, nhưng điều này có vẻ giống như giải pháp đơn giản nhất thanh lịch nhất mà tôi có thể đưa ra.

Trong config/routes.rb Tôi thiết lập một tên miền phụ auth. Tất cả các yêu cầu kết nối Oauth của tôi sẽ bắt đầu trên các tên miền phụ khác nhau và sau đó Facebook được thiết lập để chuyển tiếp những người dùng đó trở lại anh ta auth.example.com tên miền phụ.

constraints AuthRedirect do 
    devise_scope :contact do 
     get '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
     post '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
    end 
end 

Đây là /lib/auth_redirect.rb. Điều này chỉ kiểm tra xem tên miền phụ có là auth và nắm bắt lưu lượng truy cập đó hay không. Điều này được đặt ở đầu danh sách tuyến đường của tôi để được ưu tiên hơn các tên miền phụ khác.

class AuthRedirect 
    def self.matches?(request) 
     request.subdomain.present? && request.subdomain == 'auth' 
    end 
end 

Sau đó, trong khách hàng của tôi, khi người dùng nhấp vào nút Connect with Facebook, tôi gửi cho /auth/facebook?contact_id=<id>. Từ đây Devise hướng họ đến Facebook, sau đó chuyển hướng họ trở lại https://auth.example.com/.

Sau đó, trong OmniauthCallbacksController#facebook tôi có thể kéo id của người dùng từ các params omniauth như vậy:

auth = env["omniauth.auth"] 
contact = Contact.find(env['omniauth.params']['contact_id']) 

Từ đây tôi có thể tồn tại các thông tin cơ sở dữ liệu và chuyển hướng người sử dụng trở lại các tên miền phụ thích hợp. Giải pháp này tránh được các vấn đề với mã thông báo CSRF và quan trọng hơn là không yêu cầu tôi sử dụng Ruby/ERB để xây dựng đường dẫn ủy quyền omniauth mà người dùng được gửi đến khi họ nhấp vào nút kết nối.

1

bạn đã thử với redirect_uri chưa?

user_omniauth_authorize_path(:facebook, redirect_uri: @custom_callback) 

EDIT: xin lỗi Tôi đã bỏ lỡ phần thứ hai của bài đăng của bạn.

Tôi thực sự có cùng một vấn đề trong sản xuất nhưng nó hoạt động hoàn hảo trên môi trường dàn dựng. Sự khác biệt duy nhất là về url callback trên dàn trong đó có một tên miền phụ hơn * .staging.domain.com

Bởi theo cách bạn có thể cung cấp một callback_url tĩnh trong file devise initializer:

config.oaumniauth :facebook, ..., callback_url: 'url right here' 

tôi m về vấn đề này ngày hôm qua. Hoặc là tôi cung cấp một url callback tĩnh nhưng facebook tăng cho tôi một lỗi CRSF:

omniauth: (facebook) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 

Hoặc tôi để đưa ra thiết lập các callback_url động mà gonna trông giống như

https://*.domain.com/DEVISE_MODELS/auth/facebook 

và trong trường hợp này tôi nhận được một thẳng địa chỉ email gọi lại không phù hợp/danh sách trắng trong quá trình đăng nhập FG.

EDIT2:

TỐT! Tôi đã làm việc đó. Tôi có thể đăng nhập oauth bằng tên miền phụ ký tự đại diện.

  1. Cung cấp một callback_url tĩnh trong devise initializer bạn
  2. thêm tên miền để lưu trữ phiên của bạn như: miền:" .domain.com"

Với rằng tôi nhận được không phải lỗi CRSF cũng không nunmatching url CB/danh sách trắng.

Hy vọng nó sẽ làm việc cho bạn!

+0

Tôi thực sự đã giải quyết được một lúc này và quên đăng giải pháp của mình. Nó thực sự khá đơn giản. Tôi sẽ cập nhật câu trả lời của mình với giải pháp tôi đã sử dụng. Thật không may là tôi không có thời gian hoặc tài nguyên hiện tại để kiểm tra giải pháp của bạn, nhưng có vẻ khả thi, vì vậy tôi sẽ cung cấp cho nó một upvote. – ACIDSTEALTH

Các vấn đề liên quan