2012-03-09 12 views
5

Obserwuję ten doskonały artykuł do konfiguracji część uwierzytelnianie moich szyn (3,2) API:
http://blog.joshsoftware.com/2011/12/23/designing-rails-api-using-rabl-and-devise/Reklamowe uwierzytelniania z Rails i Opracować

Zrobiłem następujący krok:

-Dodano opracować do Gemfile

wyposażonym w technologię opracować dla modelu użytkownika i pobiegł migracje wymagane

-Mój modelu użytkownik ma

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 

jak również token_authenticable w bazie danych (poprzez migrację).

-Subclassed się RegistrationController z:

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 

-W routes.rb mam:

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

CREATION USER

chciałbym następującą prośbę do tworzenia użytkownika i odesłanie klucza uwierzytelniającego:

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

Rozumiem, że logika powinna iść w "create" metody kontrolera rejestracji (który powinien utworzyć użytkownika i zalogować go w tym samym czasie). Myślę, że powinienem być w błędzie, ponieważ wiadomość dostałem w zamian to:

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

Jaki jest brakujący kawałek mieć nowego użytkownika tworzony i rejestrowane? Czy nie jest POST do users.json zmapowany do RegistrationController # create?

logowania użytkownika

Również chciałbym następującą prośbę do zalogowania użytkownika w (wysyłanie mu jego authentification_token raz zostały sprawdzone login/hasło)

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

Chyba logika powinna iść w "aktualizacji" metody RegistrationController, ale nie jest w 100% pewna. Po zakończeniu logowania dodam uwierzytelnienie tokena, aby chronić tworzenie/wyświetlanie niektórych innych modeli.

UPDATE

Kiedy wydawać:

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' 

mam następujący komunikat:

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 

jakieś pomysły dlaczego użytkownik nie jest tworzony i podpisane i dlaczego nie authentication_token jest zwracany?

+0

Jeśli chcesz, aby użytkownik został utworzony przed uwierzytelnieniem, dodaj ten kod. Devise tego nie robi. –

Odpowiedz

10

To moja wina, zaktualizuję wpis na blogu. Trzeba dodać następujący kod w celu utworzenia użytkownika w was kontrolera rejestracji

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 

Daj mi znać, jeśli napotkają żadnych problemów?

+0

wielkie dzięki, rejestracja działa dobrze. Jeśli chodzi o część sign_in, rozumiem, że kod do modyfikacji znajduje się w metodzie "create" SessionsController, czy potwierdzasz? W takim przypadku login/hasło są wysyłane jako czyste w celu uwierzytelnienia? – Luc

+0

Potrzebujesz dodać następującą linię w session_controller # create method po 'sign_in (resource_name, resource) current_user.reset_authentication_token' – Sethupathi

0

Jeśli chodzi o pytanie Luca, to również moje zrozumienie.

Na przykład przy użyciu domyślnego logowania nieinterfejsowego interfejsu API logowanie obejmuje logowanie SessionsController.create. Jak mogę odzyskać authentication_token i ponownie użyć go jako część wywołań API? Ponadto, w jaki sposób przesłonić SessionsController.create, aby zadzwonić pod numer resource.reset_authentication_token!?

+0

Jeśli używasz non api, możesz uzyskać do niego dostęp jako current_user.authentication_token – Sethupathi

Powiązane problemy