2012-10-01 9 views
5

Sto provando a creare un'API per accedere all'app Rails con Devise e un token authenticatable. ho creato un SessionsController nel mio modulo API e ha scritto il seguente codice a sign_in:Accedi a un'app per rails con Devise e token_authenticatable: "401 non autorizzato"

module Api 
    module V1 
    class SessionsController < Devise::SessionsController 

     def create 
     resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new") 
     sign_in(resource_name, resource) 
     if current_user 
      if !current_user.authentication_token 
      current_user.reset_authentication_token! 
      end 
      render json: {success: true, auth_token: resource.authentication_token, email: resource.email} 
     else 
      invalid_login_attempt 
     end 
     end 

     protected 

     def invalid_login_attempt 
     warden.custom_failure! 
     render json: {success: false, message: "Error with your login or password"}, status: 401 
     end 
    end 
    end 
end 

Il problema è che l'applicazione genera un 401 quando uso il login senza alcun token.

RestClient.post "http://localhost:3000/api/v1/users/sign_in", {user: {email: "[email protected]", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json 

Ma se ho impostato il token che è stato fornito con il metodo di iscrizione funziona:

response_json = RestClient.post "http://localhost:3000/api/v1/users/sign_in?auth_token=#{@token}", {user: {email: "[email protected]", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json 

Allora, perché questo? È possibile disabilitare il processo di autenticazione del token quando si esegue un accesso?

controllori

risposta

3

Devise non funziona fuori dalla scatola quando si utilizza il formato JSON, dovrete effettuare una delle operazioni seguenti:

  • rimuovere il contenuto type => JSON e la accept => direttive JSON
  • aggiungono config.navigational_formats = [: html,: JSON] al file di configurazione escogitare
  • sovraccaricare il controller per gestire questo formato è necessario una risposta specifica, che è abbastanza comune

È possibile ottenere un esempio di lavoro lì http://jessehowarth.com/devise

+0

Grazie per la risposta. Ho seguito le istruzioni sul tuo sito web ma ottengo ancora un 401. Inoltre ottengo un errore 500 con il metodo 'non definito' split 'per: failure: Symbol'' da 'resource = warden.authenticate! (: Scope => nome_risorsa, : recall =>: failure) '. Ho anche rimosso il tipo di contenuto e accettato le direttive dalla mia richiesta e aggiunto il navigational_formats. – obo

+0

In realtà è il 'warden.authenticate! 'Che alza il 401. – obo

+0

Alla fine ci sono riuscito. I miei errori sono stati causati da una rotta sbagliata. Ho dovuto usare localhost: 3000/api/v1/sign_in invece di api/v1/users/sign_in. Tra l'altro il tuo link e i tuoi consigli nella configurazione mi hanno aiutato a far funzionare le cose correttamente. – obo

Problemi correlati