2010-03-08 6 views
19

Je construis une API de base dans laquelle les informations utilisateur peuvent être récupérées après que l'identifiant et le mot de passe de cet utilisateur ont été correctement envoyés.Rails: Accès au nom d'utilisateur/mot de passe utilisé pour HTTP Basic Auth?

En ce moment, je me sers quelque chose comme ceci:

http://foo:[email protected]/api/user.xml

Alors, ce que je dois faire est accéder à l'utilisateur/mot de passe envoyé dans la demande (le foo et bar), mais ne suis pas sûr comment accéder à cette information dans un contrôleur Rails.

Ensuite, je vérifierais ces variables via un User.find rapide, puis les définir comme les variables nom d'utilisateur et mot de passe pour authenticate_or_request_with_http_basic.

Il est possible que je regarde cela de façon complètement fausse, mais c'est là où je suis en ce moment. :)

Répondre

47

La réponse à votre question de savoir comment obtenir les informations d'identification de la demande est la suivante:

user, pass = ActionController::HttpAuthentication::Basic::user_name_and_password(request) 

Cependant authenticate_or_request_with_http_basic est tout ce que vous devez faire auth de base:

class BlahController < ApplicationController 
    before_filter :authenticate 

    protected 

    def authenticate 
    authenticate_or_request_with_http_basic do |username, password| 
     # you probably want to guard against a wrong username, and encrypt the 
     # password but this is the idea. 
     User.find_by_name(username).password == password 
    end 
    end 
end 

authenticate_or_request_with_http_basic retournera une 401 statut si les informations d'identification ne sont pas fournies, ce qui fera apparaître la boîte de dialogue nom d'utilisateur/mot de passe dans un navigateur. Si les détails sont donnés, ceux-ci sont transmis au bloc fourni. Si le bloc renvoie true, la requête est transmise. Sinon, le traitement de la demande est abandonné et un statut 403 est renvoyé au client.

Vous pouvez également consulter Railscast 82 (le code des thats étaient au-dessus est de): http://railscasts.com/episodes/82-http-basic-authentication

+0

C'est une réponse vraiment utile - quelque chose qui semble simple lecture à ce sujet, mais je me demandais comment faire cela. Merci d'avoir posté. –

1

Le rail Authlogic prend en charge cette fonctionnalité (ainsi que bien d'autres) dès sa sortie de l'emballage. Vous pouvez vous en occuper dans la source ou simplement l'intégrer dans votre application existante.

Edit:
Après avoir creusé autour du code source pour Authlogic, je trouve this file qui utilise le morceau de code suivant pour saisir le nom d'utilisateur et mot de passe:

def authenticate_with_http_basic(&block) 
    @auth = Rack::Auth::Basic::Request.new(controller.request.env) 
    if @auth.provided? and @auth.basic? 
     block.call(*@auth.credentials) 
    else 
     false 
    end 
    end 

Je regarde un peu plus loin dans où tout cela va, mais je dois me mettre au lit. J'espère avoir été utile.

Questions connexes