Разработать помощников маршрута внутри пространства имен - проблема с warden.authenticate! - PullRequest
0 голосов
/ 12 июля 2011

У меня проблема с входом в приложение через API. Я хочу аутентифицировать пользователя через POST / api / v1 / users / sign_in и вернуть объект этого пользователя, если электронная почта с паролем верна.

routes.rb

devise_for :users
...
namespace :api do
  namespace :v1 do
    devise_scope :user do
      post 'users' => 'registrations#create', :as => 'user_registration'
      post 'users/sign_in' => 'sessions#create', :as => 'user_session'
    end
  end
end

Контроллеры / API / v1 / sessions_controller.rb

class Api::V1::SessionsController < Devise::SessionsController
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => 'api/v1/sessions#failure')
    render :json => resource
  end

  def failure
    render :text => 'not good', :status => 401
  end
end

Проблема в том, что пользователь никогда не проходит аутентификацию. Он даже не выбран из базы данных. Это мой локальный журнал сервера:

Started POST "/api/v1/users/sign_in" for 127.0.0.1 at Tue Jul 12 11:46:55 +0200 2011
  SQL (0.6ms)  SHOW TABLES
  Processing by Api::V1::SessionsController#create as 
  Parameters: {"user"=>{"password"=>"[FILTERED]", "email"=>"my_email@example.com"}}
Completed   in 1ms
  Processing by Api::V1::SessionsController#failure as 
  Parameters: {"user"=>{"password"=>"[FILTERED]", "email"=>"my_email@example.com"}}
Rendered text template (0.0ms)

Я уже пытался использовать :scope => :api_v1_user и затем выдавать данные POST для user_v1_api, но это не помогло. Северный журнал выглядит так же, как этот выше.

Адрес электронной почты и пароль определенно верны, потому что когда я меняю путь с /api/vi/users/sign_in на /users/sign_in, все в порядке, и я вхожу в систему.

Ответы [ 3 ]

1 голос
/ 15 августа 2011

Проблема может заключаться в том, что вы не добавили свой контроллер сеанса для разработки контроллеров в маршрутах. Для стандартной реализации пользовательских контроллеров devise это делается в инструкции devise_for в маршрутах как:

devise_for :users, :controllers => { :sessions => "user/sessions" }

Я не уверен насчет пространства имен для вашего API. Я не знаю, является ли это лучшим способом сделать это, но, возможно, вы можете попробовать:

devise_for :users, :controllers => { :sessions => "api/v1/user/sessions" }

Удачи

0 голосов
/ 11 октября 2012

Нашел ответ на этот вопрос:

devise_for :admins, :class_name => "User"

Оригинальный пост находится здесь в Разработка Google Group . Это привело меня к тому месту, где я должен был сначала посмотреть API Docs . лол

Надеюсь, это поможет!

0 голосов
/ 23 августа 2011

Ваш метод сбоев когда-либо назывался сбоем?

На всякий случай измените 'api / v1 / session # fail' на ': fail' при вызове warden.authenticate! и посмотрите, успешна ли авторизация.

...