2012-10-01 26 views
5

Estoy intentando crear una API para iniciar sesión en mi aplicación de rieles con Devise y una autenticatable_token. he creado un SessionsController en mi módulo de API y escribió el siguiente código a sign_in:Iniciar sesión en una aplicación de rieles con Devise y token_authenticatable: "401 no autorizado"

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 

El problema es que la aplicación plantea un 401 cuando se utiliza el inicio de sesión sin ninguna ficha.

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

Pero si fijo el token que fue proporcionado por el método de registro funciona:

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 

Entonces ¿por qué esto? ¿Es posible deshabilitar el proceso de autenticación de tokens al realizar un inicio de sesión?

controladores

Respuesta

3

Idear no funciona fuera de la caja cuando se utiliza el formato JSON, que tendrán que hacer uno de los siguientes:

  • remover su contenido type => JSON y el aceptar => directivas JSON
  • añaden config.navigational_formats = [html,: JSON] a su archivo de configuración legado
  • sobrecargue el controlador para manejar ese formato en el que necesita una respuesta específica, que es bastante común

Puede obtener un ejemplo de trabajo allí http://jessehowarth.com/devise

+0

Gracias por su respuesta. Seguí las instrucciones en su sitio web pero todavía obtengo un 401. Además, obtengo un error 500 con el método '' método indefinido 'split 'para: failure: Symbol'' from' resource = warden.authenticate! (: Scope => resource_name, : recall =>: error) '. También eliminé el tipo de contenido y acepto las directivas de mi solicitud y agregué los navigational_formats. – obo

+0

En realidad, es el 'warden.authenticate!' Que aumenta el 401. – obo

+0

Finalmente tuve éxito. Mis errores fueron causados ​​por una ruta incorrecta. Tuve que usar localhost: 3000/api/v1/sign_in en lugar de api/v1/users/sign_in. Por cierto, tu enlace y tus consejos en la configuración me ayudaron a hacer que las cosas funcionen correctamente. – obo

Cuestiones relacionadas