Trước tiên, bạn cần phải thêm setup: true
để có thể nâng cấp danh sách các quyền của dịch vụ:
Devise.setup do |config|
config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
:scope => 'email,offline_access,user_about_me',
:setup => true
end
Thêm hai tuyến đường trong routes.rb
:
devise_scope :user do
get '/users/auth/:provider/upgrade' => 'omniauth_callbacks#upgrade', as: :user_omniauth_upgrade
get '/users/auth/:provider/setup', :to => 'omniauth_callbacks#setup'
end
Tuyến đường đầu tiên là nơi người dùng phải được liên kết bằng cách sử dụng user_omniauth_upgrade_path(:facebook)
. Tuyến đường thiết lập thứ hai là cuộc gọi lại mà omniauth sẽ gọi nội bộ và chúng ta có thể sử dụng để thay đổi tham số phạm vi.
Những đi vào omniauth_callbacks_controller.rb
:
def upgrade
scope = nil
if params[:provider] == "facebook"
scope = 'email,offline_access,user_about_me,publish_stream'
end
redirect_to user_omniauth_authorize_path(params[:provider]), flash: {scope: scope}
end
Khi bạn xác định setup: true
bên trong cấu hình omniauth setup_path
được gọi là theo mặc định. Chúng tôi sẽ sử dụng điều này để thay đổi phạm vi từ mặc định trong chiến lược. Thêm phần này vào omniauth_callbacks_controller.rb
:
def setup
request.env['omniauth.strategy'].options['scope'] = flash[:scope] || request.env['omniauth.strategy'].options['scope']
render :text => "Setup complete.", :status => 404
end
Cuối cùng, trong quan điểm của bạn, bạn có thể thêm:
<%= link_to "Upgrade Access", user_omniauth_upgrade_path(:facebook) %>
Nguồn: http://willschenk.com/setting-up-devise-with-twitter-and-facebook-and-other-omniauth-schemes-without-email-addresses/#passing-dynamic-scopes-to-omniauth
Bạn đã figured này ra chưa? tự hỏi mình cùng một câu hỏi ... – toxinlabs