Devise + omniauth-facebook添加权限

Mat*_*ias 6 facebook ruby-on-rails devise omniauth

我们让用户以最低权限注册,如下所示:

Devise.setup do |config|
  config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
              :scope => 'email,offline_access,user_about_me'
end
Run Code Online (Sandbox Code Playgroud)

我们这样做是为了提高注册率(您要求转换率越高的权限越少).

但是后来当例如用户希望fb共享某些东西时我们需要publish_stream权限.

有谁知道如何提升fb权限?举例来说:'email,offline_access,user_about_me,publish_stream'

我知道用户必须再次通过oauth对话框..但是如何做到这一点?

谢谢

eve*_*lli 5

首先,您需要添加setup: true以能够升级服务的权限列表:

Devise.setup do |config|
  config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
                  :scope => 'email,offline_access,user_about_me',
                  :setup => true
end
Run Code Online (Sandbox Code Playgroud)

在中添加两条路线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
Run Code Online (Sandbox Code Playgroud)

第一条路线是应该通过使用链接用户的位置 user_omniauth_upgrade_path(:facebook)。第二个设置路径是omniauth将在内部调用的回调,我们可以使用它来更改scope参数。

这些进入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
Run Code Online (Sandbox Code Playgroud)

当您setup: true在omniauth内部指定时setup_path,默认情况下会调用配置。我们将使用它来更改策略中默认值的范围。将此添加到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
Run Code Online (Sandbox Code Playgroud)

最后,您可以在视图中添加:

<%= link_to "Upgrade Access", user_omniauth_upgrade_path(:facebook) %>
Run Code Online (Sandbox Code Playgroud)

资料来源:http : //willschenk.com/setting-up-devise-with-twitter-and-facebook-and-other-omniauth-schemes-without-email-addresses/#passing-dynamic-scopes-to-omniauth