RoR:Devise / OAuth2冲突?

时间:2014-02-10 14:03:15

标签: ruby-on-rails devise oauth-2.0 box-api

作为一个RoR新手,我正在使用rails-stripe-membership -asas代码(https://github.com/RailsApps/rails-stripe-membership-saas)作为我的应用程序的基础(使用Devise进行身份验证)并尝试将ruby-box gem集成到其中( https://github.com/attachmentsme/ruby-box)访问Box API。

我遇到了我认为是Devise会话和后续ruby-box(OAuth2)会话之间的冲突。我的用户模型包含:

# :omniauthable
devise :database_authenticatable, :registrerable, :recoverable, :rememberable, :trackable, :validatable

用户登录后,我将其重定向到Box以允许他们授予对我的应用程序的访问权限。这是在我的application_controller中处理的,目前可以这样工作,

def after_sign_in_path_for(resource)
    case current_user.roles.first.name
      when 'silver'      
        require 'ruby-box'
        session = RubyBox::Session.new({client_id: '###',
        client_secret: '###'})
        authorize_url = session.authorize_url('https://myurl.com/auth/box')     
    end
  end

一旦用户授予对我的应用程序的访问权限,他们就会被重定向到我的Box控制器(auth / box),我试图根据他们在重定向中提供的代码从Box获取访问令牌,

class BoxController < ApplicationController
  def new
    @token = session.get_access_token('code-returned-to-redirect_url')
  end
end

这是当我遇到问题时,收到错误:

undefined method 'get_access_token' for #<Rack::Session::Abstract::SessionHash:0x0000003b4cf00>

我只能假设在调用“session”时它无法区分当前用户会话和Box会话?我怎么能纠正这个?

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

我对ruby-box并不是特别熟悉,但似乎他们的Session课程容易引起混淆。可以从控制器访问的Rails会话对象是一种跨用户请求管理持久状态的方法 - 这是单词&#34; session的典型用法。&#34;但红宝石盒会议并不是那种类型;它似乎只是一个普通的旧ruby对象,带有一个用于向ruby框发出oauth授权请求的API。

关键是请求之间没有任何RubyBox::Session对象的持久性。因此,当您在登录后重定向用户时,您在session中创建的本地变量after_sign_in_path_for将不再可用。因此,当您在session中引用BoxController时,您获得的是实际的会话对象,而不是RubyBox::Session

您尝试的工作流程并非针对Authorization Code oauth授权类型(应用程序的用户明确授权访问他们拥有的某些受保护资源,并且您进行交换的类型)访问令牌的授权码)。它似乎是为Client Credentials授权许可而设计的。也就是说,您只是根据您的客户端密钥和客户端密钥获取令牌,在您对客户端进行身份验证后,访问受保护资源的授权是隐含的。

编辑添加:如果您想通过Box验证您的用户,您应该看一下omniauth-box,这将有助于您轻松实现授权代码oauth流程,并且可以很好地配合设计。

因此,您所关注的文档似乎并非针对您考虑的用例而设计。但至于会话,是的,Rails控制器中的session帮助器是指用户的会话数据,这些数据在请求之间是持久的,而不是RubyBox::Session对象。