2014-02-10 1 views
0

RoR 초보자로서, 내 응용 프로그램의베이스 (인증 용 Devise 사용)에 레일 스 트라이브 멤버십 코드 (https://github.com/RailsApps/rails-stripe-membership-saas)를 사용하고 액세스 할 수있는 루비 박스 젬 (https://github.com/attachmentsme/ruby-box)을 통합하려고 시도하고 있습니다. Box API.RoR : Devise/OAuth2 충돌?

Devise 세션과 후속 루비 박스 (OAuth2) 세션 사이에 충돌이 있다고 생각합니다. 내 사용자 모델은 다음을 포함합니다 :

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

사용자가 로그인하면 사용자가 응용 프로그램에 대한 액세스 권한을 부여 할 수 있도록 상자로 리디렉션됩니다. 이것은 내 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 

사용자 부여가 내 응용 프로그램에 액세스하면

는, 그들이 내가 액세스를 얻기 위해 시도하고있어 내 박스 컨트롤러 (인증/상자)로 리디렉션됩니다, 같은 작동합니다 그들이 리디렉션에서 제공하는 코드를 기반으로 상자에서 토큰, 내가 문제로 실행하면

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> 

난 단지 "전화에서 것을 가정 할 수있다 세션 "은 현재 사용자 세션과 Box 세션을 구별 할 수 없습니까? 이 문제를 어떻게 해결할 수 있습니까?

시간과 협조에 감사드립니다.

답변

1

저는 특히 ruby-box에 익숙하지 않지만 그 Session 클래스는 혼동을 일으킬 정도로 나타납니다. 컨트롤러에서 액세스 할 수있는 Rails 세션 객체는 일반적인 "세션"사용과 같이 사용자 요청에 대한 지속성 상태를 관리하는 방법입니다. 그러나 루비 박스 세션은 아무 것도 아닙니다. 루비 박스에 oauth 인증 요청을하기위한 API를 가진 평범한 오래된 루비 객체 인 것처럼 보입니다.

핵심은 요청 사이에 어떤 RubyBox::Session 개체의 지속성이 없다는 것입니다. 따라서 로그인 한 후 사용자를 리디렉션하면 에서 생성 한 로컬 변수 session을 더 이상 사용할 수 없습니다. 따라서 에서 session을 참조하면 RubyBox::Session이 아닌 실제 세션 객체가 나타납니다.

시도하는 워크 플로가 Authorization Code oauth 부여 유형 (응용 프로그램 사용자가 소유 한 보호 된 리소스에 대한 액세스 권한을 명시 적으로 부여하고 액세스 토큰에 대한 인증 코드를 교환하는 종류). 승인 보조금 Client Credentials 용으로 설계된 것으로 보입니다. 즉, 클라이언트를 인증 한 후에 보호 된 리소스에 대한 액세스 권한이 암시 적으로 나타나는 클라이언트 키와 클라이언트 비밀을 기반으로하는 토큰을 얻는 것입니다.

수정 사항 : Box를 통해 사용자를 인증하려면 대신 omniauth-box을 확인해야합니다. 그러면 인증 코드 oauth 흐름을 쉽게 구현하고 문제없이 잘 작동합니다.

따라서 현재 사용중인 설명서가 귀하가 염두에두고있는 사용 사례를 위해 설계되지 않은 것으로 보입니다. 하지만 세션의 경우, session 도우미 컨트롤러의 헬퍼는 RubyBox::Session 객체가 아닌 요청을 통해 지속되는 사용자의 세션 데이터를 참조합니다.

+0

자세한 설명 주셔서 감사 드리며, 크게 감사하겠습니다. – user464180