2012-03-09 2 views
5

Я следую за эту прекрасную статью и настройку аутентификации части моих рельсов (3.2) API:
http://blog.joshsoftware.com/2011/12/23/designing-rails-api-using-rabl-and-devise/Токен аутентификации с Rails и Придумайте

Я сделал следующий шаг:

-Добавлена ​​DEViSE в Gemfile

-Enabled изобрести для модели пользователя и побежал миграциях требуется

-Мой модель пользователя

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable 
    devise :token_authenticatable 

    attr_accessible :email, :authentication_token, :password, :password_confirmation, :remember_me 
end 

а также token_authenticable в базе данных (через миграцию).

-Subclassed в RegistrationController с:

class RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    end 

    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => " {controller_path}#new") 
    sign_in(resource_name, resource) 
    current_user.reset_authentication_token! 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 

    def update 
    super 
    end 
end 

-В routes.rb, у меня есть:

devise_for :users, :controllers => {:registrations => "registrations"} 

USER СОЗДАНИЯ

Я хотел бы следующий запрос, чтобы создать пользователю и отправить обратно authentification_token:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"user":{"email":"[email protected]", "password":"pass"}}' 'http://localhost:3000/users.json 

Мое понимание заключается в том, что логика должна идти в методе «создания» контроллера регистрации (который должен создать пользователя и войти в него одновременно). Я думаю, что я должен быть неправильным, как сообщение, которое я получил в ответ является:

{"error":"You need to sign in or sign up before continuing."} 

Что недостающий кусок, чтобы иметь нового пользователя созданы и запротоколированы? Не является POST для пользователей. Json сопоставлен с RegistrationController # create?

ВХОД ДЛЯ ПОЛЬЗОВАТЕЛЕЙ

Кроме того, я хотел бы следующий запрос для входа пользователя в (отправить его обратно его authentification_token когда Логин/пароль был проверен)

curl -H "Accept: application/json" -H "Content-type: application/json" -X GET -d '{"user":{"email":"[email protected]","password":"pass"}}' 'http://localhost:3000/users.json 

я думаю логика должна идти в «обновлении» метода RegistrationController, но не на 100% уверен в этом. После того, как логин будет выполнен, я добавлю аутентификацию токена, чтобы защитить создание/просмотр некоторых других моделей.

UPDATE

Когда я выдаю:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"user":{"email":"[email protected]", "password": "mypass", "phone":"1234567890"}}' 'http://localhost:3000/users.json' 

я получил следующее сообщение:

Started POST "/users.json" for 127.0.0.1 at 2012-03-11 20:50:05 +0100 
Processing by RegistrationsController#create as JSON 
Parameters: {"user"=>{"email"=>"[email protected]", , "password"=>"[FILTERED]", "phone"=>"1234567890"}, "registration"=>{"user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "phone"=>"1234567890"}, "action"=>"create", "controller"=>"registrations", "format"=>"json"}} 
WARNING: Can't verify CSRF token authenticity 
Completed 401 Unauthorized in 1ms 

Любые идеи, почему пользователь не создан и подписан и почему не authentication_token возвращается?

+0

Если вы хотите, чтобы пользователь был создан до аутентификации, вы должны добавить этот код. Разработчик этого не делает. –

ответ

10

Это моя ошибка, я обновлю сообщение в блоге. Вам нужно добавить следующий код, чтобы создать пользователя в вас регистрации контроллера

if params[:api_key].blank? or params[:api_key] != API_KEY 
    render :json => {'errors'=>{'api_key' => 'Invalid'}}.to_json, :status => 401 
    return 
end 
build_resource 
if resource.save 
    sign_in(resource) 
    resource.reset_authentication_token! 
    #rabl template with authentication token 
    render :template => '/devise/registrations/signed_up' 
else 
    render :template => '/devise/registrations/new' #rabl template with errors 
end 

Позвольте мне знать, если вы сталкиваетесь с какой-либо проблемы?

+0

Большое спасибо, регистрация работает нормально. Что касается части sign_in, я понимаю, что код, который нужно изменить, находится в методе «create» SessionController, вы подтверждаете? В этом случае логин/пароль отправляются в clear для аутентификации? – Luc

+0

Вам нужно добавить следующую строку в session_controller # create method после 'sign_in (resource_name, resource) current_user.reset_authentication_token' – Sethupathi

0

Что касается вопроса Люка, это тоже мое понимание.

Например, используя вход по умолчанию, не входящий в API, SessionsController.create обрабатывает логин. Как получить authentication_token и повторно использовать его как часть вызовов API позже? Также, как мне переопределить SessionsController.create для вызова resource.reset_authentication_token!?

+0

Если вы используете не api, тогда вы можете получить к нему доступ как current_user.authentication_token – Sethupathi

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