【问题标题】:Asking for more facebook user permissions only for "admins" in Rails仅在 Rails 中为“管理员”请求更多 facebook 用户权限
【发布时间】:2014-01-05 12:37:20
【问题描述】:

我正在使用 facebook 制作一个网页,其中有简单的用户和管理员。管理员可以将文章发布到网页上,当他们这样做时,它会被发布到 Facebook 页面的墙上。此功能正在运行,但我在动态 facebook 权限方面遇到了一些问题。

在我的omniauth.rb中我修改了:

  • :scope =>...." to ":setup => true
  • 我将match '/auth/facebook/setup' => 'authentications#setup_fb' 添加到我的路线中

但是,当我测试页面时,setup_fb 方法不会被调用(我已将 logger.info 放入其中,但没有任何反应)。我该如何解决它,或者您认为问题是什么?

我唯一的想法是“设计会议”与它有关,因为我有:

devise_for ...:controllers => {:sessions => 'sessions'}

我正在使用omniauth-facebook,设计。我是 Rails 新手 :)

【问题讨论】:

    标签: ruby-on-rails facebook devise omniauth


    【解决方案1】:

    动态权限与设置阶段

    动态权限

    所以,听起来您正在争取动态权限,看起来您已经通过您的 :scope => ... 正确设置了该设置,假设看起来像这样

    :scope => 'email,user_events,user_location,user_birthday'
    

    设置阶段

    话虽如此,通过传递 :setup => true,您是在告诉omniauth 启动setup phase,默认情况下它是关闭的。

    我认为,根据您的问题,如果动态权限是要完成的任务,那么您的 :scope => ... 可以实现这一目标。只需删除 :setup => true 并让您的回调流程正常继续,而不会在设置阶段中断它。

    设计 Omniauth 回调

    我假设您仍然需要设置回调阶段。

    使用 Devise 执行此操作的常用方法是更改​​您的 config/routes.rb 文件以定义自定义回调控制器,如下所示:

    devise_for ... controllers: {omniauth_callbacks: 'omniauth_callbacks'}
    

    所以你的看起来像

    devise_for ... controllers: {:sessions => 'sessions', :omniauth_callbacks => 'omniauth_callbacks'}
    

    您需要创建控制器 app/controllers/omniauth_callbacks_controller.rb 并定义 facebook 操作。 Controller 也应该从 Devise::OmniauthCallbacksController 继承。像这样的

    class OmniauthCallbacksController < Devise::OmniauthCallbacksController
      def facebook
        ... # Do awesome user lookup/sign_in/redirect stuffs
        ... # request.env['omniauth.auth'] holds the returned information your :scope requested 
      end
    end
    

    这应该可以解决您的重定向问题。如果您确实打算使用设置阶段,请告诉我,我可以修改我的答案。

    【讨论】:

    • 基本上在这个解决方案中我只能拥有一种“facebook权限类型”范围,因为如果我以这种方式定义我的范围,当我必须检查用户何时需要“manage_pages”时,我已经获得了 access_token许可与否。我对吗? (我只想向管理员询问 manage_pages 令牌)我的问题是我需要登录该用户,检查其是否为管理员,然后将 manage_pages 权限附加到范围并获取新的访问令牌。无论如何我投票给你的答案,谢谢你的解释。
    • [Second half :)] 顺便说一句,我意识到也许最简单的方法是使用 AJAX 调用:(1)用户登录 -> 主页或管理员特定页面上的 doc.rdy.fnct (2) #{ if user is admin } 继续使用更多 ajax (3) window.location.url = /auth/facebook?scope=manage_pages 你认为这是一个可以接受的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2018-05-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多