2010-03-08 30 views
19

Estoy construyendo una API básica donde se puede recuperar la información del usuario después de que se haya enviado correctamente el nombre de usuario y la contraseña.Rieles: ¿Cómo acceder al nombre de usuario/contraseña utilizados para HTTP Basic Auth?

En este momento estoy usando algo como esto:

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

Por lo tanto, lo que tengo que hacer es acceder el usuario/contraseña enviada en la solicitud (el foo y bar), pero no estoy seguro cómo acceder a esa información en un controlador de Rails.

Luego verificaría esas variables a través de un User.find rápido y las establecería como variables de nombre de usuario y contraseña para authenticate_or_request_with_http_basic.

Es posible que esté viendo esto de una manera completamente incorrecta, pero ahí es donde estoy ahora. :)

Respuesta

47

La respuesta a su pregunta de cómo obtener las credenciales de la solicitud es la siguiente:

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

Sin embargo authenticate_or_request_with_http_basic es todo lo que necesita hacer autenticación básica:

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 devolverá una Estado 401 si no se proporcionan credenciales, lo que hará que aparezca el cuadro de diálogo nombre de usuario/contraseña en un navegador. Si se dan detalles, estos se pasan al bloque provisto. Si el bloque devuelve verdadero, la solicitud se procesa. De lo contrario, el proceso de solicitud se cancela y se devuelve un estado 403 al cliente.

También puede comprobar fuera de Railscast 82 (eso eran el código anterior es desde): http://railscasts.com/episodes/82-http-basic-authentication

+0

Esta es una respuesta realmente útil - algo que parece simple lectura de ello, pero me preguntaba cómo hacer esto. Gracias por publicar. –

1

El complemento de raíles Authlogic es compatible con esta funcionalidad (y mucho más) de fábrica. Podrías rootear el origen de la misma o simplemente integrarla en tu aplicación existente.

Editar:
Después de cavar todo el código fuente para Authlogic, encontré this file que utiliza el siguiente fragmento de código para agarrar el nombre de usuario y contraseña:

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 

miraría un poco más lejos a donde va todo, pero tengo que irme a la cama. Espero que haya sido de ayuda.

Cuestiones relacionadas