【问题标题】:Devise + omniauth-facebook Add permissions设计 + omniauth-facebook 添加权限
【发布时间】:2012-10-05 07:17:32
【问题描述】:

我们让用户以这样的最低权限注册:

Devise.setup do |config|
  config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
              :scope => 'email,offline_access,user_about_me'
end

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

但是稍后当例如用户想要在 fb 上分享某些内容时,我们需要获得 publish_stream 权限。

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

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

谢谢

【问题讨论】:

  • 你想通了吗?问自己同样的问题...

标签: ruby-on-rails facebook devise omniauth


【解决方案1】:

首先需要添加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

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

第一个路由是用户应该使用user_omniauth_upgrade_path(:facebook) 链接到的位置。第二个设置路由是omniauth内部调用的回调,我们可以用来改变范围参数。

这些进入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

当您在omniauth 配置中指定setup: true 时,默认调用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

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

<%= link_to "Upgrade Access", user_omniauth_upgrade_path(:facebook) %>

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

【讨论】:

  • 如果您在#setup 中使用render :text,您现在似乎会获得双重渲染。它适用于head :no_content
【解决方案2】:

使用 facebook 登录仅使用两个权限 - 1) 电子邮件 2) publish_stream

config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],{:scope => 'email, publish_stream', :client_options => { :ssl => { :ca_file => "#{Rails.root}/config/ca-bundle.crt" } } }

【讨论】:

  • 不确定你的意思。我想做的是稍后添加新权限。假设在某个时候用户想做一些需要upload_photo 权限的事情。如何使用 facebook connect 打开一个专门要求该权限的弹出窗口?
猜你喜欢
  • 2014-05-23
  • 2012-03-05
  • 2011-05-15
  • 2016-06-10
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多