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?
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
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 .
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
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'