web-dev-qa-db-fra.com

Devise API authentification

Je travaille sur une application Web Rails qui fournit également une API basée sur JSON pour les appareils mobiles. Les clients mobiles doivent d'abord obtenir un jeton avec (email/pass), puis les clients passeront des appels d'API sous-séquentiels avec le jeton.

Je suis assez nouveau dans Devise et je recherche une API Devise ressemblant à authenticate(email, pass) et que je prévoie de renvoyer vrai/faux. Je vais donc créer et rendre le jeton ou renvoyer un message de refus. mais semble que Devise ne fournit pas quelque chose comme ça.

Je suis conscient que Devise 1.3 fournit une authentification basée sur JSON, mais c'est un peu différent de ce dont j'ai besoin - je dois générer un jeton et le gérer sur le client, puis cette autorisation est ensuite utilisée à l'aide du jeton.

Quelqu'un peut-il s'il vous plaît donner des pointeurs?

45
Xiaotian Guo

Il existe une configuration de périphérique appelée :token_authenticatable. Donc, si vous ajoutez cela à la méthode invent dans votre "utilisateur", vous pouvez vous authentifier dans votre API simplement en appelant

"/api/v1/recipes?qs=sweet&auth_token=[@user.auth_token]"

Vous voudrez probablement aussi ceci dans votre utilisateur:

before_save :ensure_authentication_token

UPDATE (avec code d'autorisation de l'API)

La méthode que vous recherchez est:

resource = User.find_for_database_authentication(:login=>params[:user_login][:login])
resource.valid_password?(params[:user_login][:password])

voici mon Gist avec un login JSON/API à grande échelle avec le système

48
Jesse Wolgamott

Je recommanderais de lire le Devise Wiki , car Devise supporte nativement l'authentification par jeton en tant que module. Je n'ai pas personnellement travaillé avec l'authentification de jeton dans Devise, mais Brandon Martin a un exemple d'exemple d'authentification de jeton ici .

2
janders223

Devise est basé sur Warden, un middleware d’authentification pour Rack.

Si vous devez implémenter votre propre méthode (alternative) d'authentification d'un utilisateur, vous devez examiner Warden en combinaison avec les stratégies fournies avec Devise: https://github.com/plataformatec/devise/tree/master/lib/devise/strategies

1
chris_b

Si l'authentification par jeton ne vous convient pas, vous pouvez également renvoyer un cookie et demander au client de l'inclure dans l'en-tête de la demande. Cela fonctionne très semblable au contrôleur de sessions Web. 

Dans un contrôleur de sessions API

class Api::V1::SessionsController < Devise::SessionsController

  skip_before_action :authenticate_user!
  skip_before_action :verify_authenticity_token

  def create
    warden.authenticate!(:scope => :user)
    render :json => current_user
  end

end

Dans les routes

namespace :api, :defaults => { :format => 'json' } do
  namespace :v1 do
    resource :account, :only => :show
    devise_scope :user do
      post :sessions, :to => 'sessions#create'
      delete :session, :to => 'sessions#destroy'
    end
  end
end

Ensuite, vous pouvez faire ce genre de chose (les exemples utilisent HTTPie )

http -f POST localhost:3000/api/v1/sessions user[email][email protected] user[password]=passw0rd

Les en-têtes de réponse auront une session dans l'en-tête Set-Cookie. Mettez la valeur de cela dans les requêtes suivantes.

http localhost:3000/api/v1/restricted_things/1 'Cookie:_my_site_session=<sessionstring>; path=/; HttpOnly'
0
Mark Swardstrom