2009-07-24 13 views
17

Estoy intentando escribir una aplicación de consumidor OAuth simple en Rails. Estoy usando Authlogic para manejar la autenticación y el plugin de Authlogic OAuth para hacer lo propio.Creación implícita de usuarios con el complemento Authlogic and Authlogic OAuth

El complemento oauth proporciona un par de ayudantes para generar el botón de inicio de sesión: oauth_login_button y oauth_register_button. Junto con las lógicas de Authlogic y los filtros de solicitud del complemento, estos dos botones crean de alguna manera la sesión/usuario.

Lo que sucede a continuación es el siguiente: - si utilizo el asistente oauth_login_button, entonces el objeto de sesión no puede guardarse porque no hay tal usuario localmente. - si uso el oauth_register_button helper, entonces, en cualquier inicio de sesión después del primero, Rails se queja de que el token ya se ha tomado ... eso significa que no puede crear la segunda copia para el mismo usuario, lo cual es correcto.

El problema es: no quiero tener AMBOS botones de registro e inicio de sesión en mi sitio.

En el lado del usuario, lo que quiero lograr es un solo botón en la página de inicio, que dice smth. como "Iniciar sesión con Twitter", que el usuario debe hacer clic para acceder a las páginas internas del sitio.

En el lado del servidor, quiero crear implícitamente la cuenta de usuario local, si el usuario visita por primera vez mi sitio.

¿Alguna pista sobre cómo hacer esto?

Todas las muestras en Authlogic + OAuth yo era capaz de encontrar no parece que se preocupan por tener tan solo un botón de inicio de sesión. :(

Respuesta

11

parece que voy a responder a la pregunta a mí mismo.

uso el siguiente código para generar el botón Iniciar sesión (en HAML):

- form_tag({:controller => "users", :action => "create"}, {:method => "post"}) do 
    = oauth_register_button :value => "Sign In with Twitter" 

y luego simplemente crear el objeto de sesión del usuario en el método de creación de la clase UsersController, si el usuario ya existe :

def create 
    @user = User.new(params[:user]) 
    @user.save do |result| # LINE A 
    if result 
     flash[:notice] = "Account registered!" 
     redirect_to some_inner_path 
    else 
     unless @user.oauth_token.nil? 
     @user = User.find_by_oauth_token(@user.oauth_token) 
     unless @user.nil? 
      UserSession.create(@user) 
      flash.now[:message] = "Welcome back!" 
      redirect_to some_inner_path   
     else 
      redirect_back_or_default root_path 
     end 
     else 
     redirect_back_or_default root_path 
     end 
    end 
    end 
end 

Si el usuario visita por primera vez, entonces el objeto de usuario se guarda correctamente en la LÍNEA A. Si no lo está y hay un token oauth disponible, tratamos de capturar al usuario de la base de datos y registrarlo él/ella en.

+0

Exactamente lo que estaba buscando. Gracias –

+0

esto es muy útil – Anurag

+0

Muchas gracias :) –

Cuestiones relacionadas