2010-03-08 8 views
19

Ich erstelle eine grundlegende API, in der Benutzerinformationen abgerufen werden können, nachdem der Benutzername und das Kennwort des Benutzers korrekt gesendet wurden.Rails: Zugriff auf den Benutzernamen/das Passwort für HTTP Basic Auth?

Im Moment bin ich mit so etwas wie dies:

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

Also, was ich tun muss, um den Benutzer/Passwort in der Anfrage gesendet zugreifen (die foo und bar), aber bin nicht sicher, wie Sie auf diese Informationen in einem Rails-Controller zugreifen.

Dann würde ich diese Variablen über eine schnelle User.find überprüfen und dann diese als Benutzernamen und Passwort-Variablen für authenticate_or_request_with_http_basic setzen.

Es ist möglich, dass ich auf die völlig falsche Art und Weise sehe, aber das ist, wo ich gerade bin. :)

Antwort

47

Die Antwort auf Ihre Frage, wie die Anmeldeinformationen aus der Anforderung zu erhalten, ist dies:

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

jedoch authenticate_or_request_with_http_basic ist alles, was Sie grundlegende Auth tun müssen:

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 a zurückkehren 401 status, wenn die Zugangsdaten nicht angegeben werden, wodurch der Benutzername/Passwort-Dialog in einem Browser angezeigt wird. Wenn Details angegeben werden, werden diese an den bereitgestellten Block übergeben. Wenn der Block den Wert wahr zurückgibt, wird die Anforderung durchlaufen. Andernfalls wird die Anfrageverarbeitung abgebrochen und ein 403-Status wird an den Client zurückgegeben.

Sie auch Railscast Besuche 82 (das ist waren oberhalb der Code ist aus): http://railscasts.com/episodes/82-http-basic-authentication

+0

Dies ist eine wirklich hilfreiche Antwort - etwas, das über das einfache Lesen scheint, aber ich frage mich, wie dies zu tun. Danke fürs Schreiben. –

1

Das Schienenplugin Authlogic unterstützt diese Funktionalität (sowie vieles mehr) aus der Box. Sie können in der Quelle dafür herumwühlen oder einfach in Ihre bestehende Anwendung integrieren.

Edit:
Nach Authlogic um den Quellcode zu graben, fand ich this file, die den folgenden Code verwendet den Benutzernamen und das Passwort zu greifen:

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 

ich ein bisschen weiter aussehen würde in wohin es geht, aber ich muss ins Bett gehen. Hoffe ich war etwas Hilfe.