Ruby on rails RoR:设计/组织2冲突?

Ruby on rails RoR:设计/组织2冲突?,ruby-on-rails,devise,oauth-2.0,box-api,Ruby On Rails,Devise,Oauth 2.0,Box Api,作为RoR新手,我正在使用rails stripe成员资格saas代码()作为我的应用程序的基础(使用Desive进行身份验证),并尝试将ruby box gem()集成到其中以访问box API 我遇到了我认为是Desive会话和随后的ruby box(OAuth2)会话之间的冲突。我的用户模型包含: # :omniauthable devise :database_authenticatable, :registrerable, :recoverable, :rememberable, :t

作为RoR新手,我正在使用rails stripe成员资格saas代码()作为我的应用程序的基础(使用Desive进行身份验证),并尝试将ruby box gem()集成到其中以访问box API

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

# :omniauthable
devise :database_authenticatable, :registrerable, :recoverable, :rememberable, :trackable, :validatable
用户登录后,我将他们重定向到Box,以允许他们授予对我的应用程序的访问权限。这是在我的应用程序_控制器中处理的,目前正是这样工作的

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
class-BoxController
这是我遇到问题时得到的错误:

undefined method 'get_access_token' for #<Rack::Session::Abstract::SessionHash:0x0000003b4cf00>
未定义的方法“获取\u访问\u令牌”#
我只能假设在调用“session”时,它无法区分当前用户会话和Box会话?我怎样才能纠正这个错误


感谢您的时间和帮助。

我对
ruby box
不是特别熟悉,但他们的
会话
类的名称似乎有点混淆。Rails会话对象可从控制器访问,它是一种管理用户请求间持久状态的方法——这是“会话”一词的典型用法;它看起来只是一个普通的老ruby对象,带有向ruby box发出oauth授权请求的API

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

您正在尝试的工作流不是为oauth授权类型设计的(应用程序的用户明确授权访问他们所拥有的某些受保护资源,并且您将授权代码交换为访问令牌)。它似乎是为授权而设计的。也就是说,您只是获得了一个基于客户机密钥和客户机机密的令牌,在对客户机进行身份验证后,访问受保护资源的授权是隐式的

编辑添加:如果您想通过Box验证您的用户,您应该查看一下,这将帮助您轻松实现授权代码oauth流,并且可以很好地使用Desive


因此,您所遵循的文档似乎不是为您所考虑的用例而设计的。但是对于会话,是的,Rails控制器中的
session
helper指的是跨请求持久化的用户会话数据,而不是
RubyBox::session
对象。

感谢您的详细解释,我非常感谢。