2014-02-10 3 views
0

Являясь новичком RoR, я использую код rails-stripe-membership-saas (https://github.com/RailsApps/rails-stripe-membership-saas) для базы моего приложения (используя Devise для аутентификации) и пытаюсь интегрировать в него драгоценный камень ruby-box (https://github.com/attachmentsme/ruby-box) для доступа к API Box.RoR: Конфликты Devise/OAuth2?

Я сталкиваюсь с тем, что, как я считаю, является конфликтом между сеансом 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 (авт/коробке), где я пытающийся получить доступ лексема из 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> 

Я могу только предположить, что в вызове " сеанс ", что не позволяет отличить текущий сеанс пользователя и сеанс Box? Как я могу исправить это?

Спасибо за ваше время и помощь.

ответ

1

Я не очень-то знакомлюсь с ruby-box, но оказалось, что их класс Session с конфискованием. Объект сеанса Rails, доступный из контроллеров, является способом управления постоянным состоянием между запросами для пользователя - типичным использованием слова «сеанс». Но сеанс рубинового окна ничего подобного не представляет; это просто простой старый рубиновый объект с API для выполнения запросов авторизации oauth в ruby ​​box.

Ключ в том, что между запросами не существует постоянства объекта RubyBox::Session. Поэтому, когда вы перенаправляете пользователя после входа в систему, локальная переменная session, которую вы создали в after_sign_in_path_for, больше не существует. Поэтому, когда вы ссылаетесь на session в свой BoxController, вы получаете фактический объект сеанса, а не RubyBox::Session.

Рабочий процесс, который вы пытаетесь, не предназначен для типа предоставления oauth-типа Authorization Code (вид, в котором пользователь вашего приложения явно разрешает доступ к некоторому защищенному ресурсу, которому они принадлежат, и вы обмениваете код авторизации для токена доступа). Похоже, что он предназначен для разрешения на предоставление Client Credentials. То есть вы просто получаете маркер на основе ключа клиента и клиента, когда авторизация для доступа к защищенным ресурсам является неявной после того, как вы аутентифицировали своего клиента.

Отредактировано для добавления: если вы хотите аутентифицировать своих пользователей через Коробку, вы должны взглянуть на omniauth-box, что поможет вам легко реализовать код авторизации oauth flow и будет хорошо играть с разработкой.

Таким образом, похоже, что документация, которую вы ищете, не предназначена для использования в вашем случае. Но что касается сессий, то да, помощник session в контроллере Rails ссылается на данные сеанса пользователя, которые являются постоянными между запросами, а не RubyBox::Session.

+0

Спасибо за подробное объяснение, я очень благодарен. – user464180

Смежные вопросы