作为一个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会话?我怎么能纠正这个?
感谢您的时间和帮助。
答案 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
对象。