2013-10-19 12 views
5

Aloha,rotolamento un mechanisim token di autenticazione in cima a concepire [Rails 4]

Dopo aver scoperto token_authenticatable Devise' è stato deprezzato, ora sto cercando di rotolare la mia soluzione, tuttavia credo che sto avendo un problema con devise' metodo sign_in:

spec:

context "with an admin user" do 
    before(:each) { @user = FactoryGirl.create(:user, account_type: 'admin') } 
    it "should respond with a 200 status" do 
     post :verify, "token"=> @user.authentication_token 
     response.status.should eq(200) 
    end 
end 

errore:

1) UsersController#verify with an admin user should respond with a 200 status 
    Failure/Error: post :verify, "token"=> @user.authentication_token 
    NoMethodError: 
     undefined method `user' for nil:NilClass 
    # ./app/controllers/application_controller.rb:24:in `authenticate_user_from_token!' 
    # ./spec/controllers/users_controller_spec.rb:39:in `block (4 levels) in <top (required)>' 

application_controller.rb:

class ApplicationController < ActionController::Base 
    # If there's a token present we're using the api authentication 
    # mechanism, else we fall back to devise auth 
    before_filter :authenticate_user_from_token!, :authenticate_user! 

    # Setup an AccessDenied error 
    class AccessDenied < StandardError; end 
    # setup a handler 
    rescue_from AccessDenied, :with => :access_denied 


    private 

    # API requests should be made to the resource path 
    # with the requesters token as params. 
    # 
    # This method extracts the params, checks if they are 
    # valid and then signs the user in using devise' sign_in method 

    def authenticate_user_from_token! 
    user = User.find_by_authentication_token params[:token] 

    if !user.nil? && user.admin? 
     # store: false ensures we'll need a token for every api request 
     sign_in user, store: false # this is the line the spec complains about 
    else 
     raise ApplicationController::AccessDenied 
    end 
    end 

    def access_denied 
    render :file => "public/401", :status => :unauthorized 
    end 


end 

users_controller.rb

class UsersController < ApplicationController 

    [snip] 

    # We use this 'verify' method to provide an endpoint 
    # for clients to poll for token verification 
    # If the before filter rejects the user/token 
    # they recieve a 401, else we respond with a 200 
    # and the user params for verification on the remote app 
    def verify 
    user = User.find_by_authentication_token params[:token] 
    render json: user 
    end 
end 

non so dove il metodo 'utente' l'errore cita che viene chiamato, né ciò che l'oggetto è in fase di chiamata su è.

+0

Avendo lo stesso problema. Mi piacerebbe se qualcuno condividesse qualche intuizione! –

+0

Sono una di quelle persone orribili che si muove direttamente quando trovo un problema, piuttosto che tornare e aggiungere una risposta. L'ho superata anche se ho finito per arrotolare questo lotto in un piccolo gioiello. IIRC, questo era un problema con l'env test piuttosto che con l'app vera e propria. Tornerò indietro e scoprirò cosa ho fatto .. – user2013350

risposta

0

Ho trovato Authy devise module molto facile da usare/modificare per l'autenticazione basata su token, piuttosto che da solo.

+1

Penso che l'OP significhi autenticazione token, non autenticazione a due fattori. – Han

+0

Vedo, ho preso token per indicare un token hardware o un token di autenticazione come un token o SecureID. Grazie per la correzione. –