Pergunta

Estou tentando escrever um aplicativo simples de consumidor da OAuth em Rails. Estou usando o AuthLogic para lidar com a autenticação e o plug -in AuthLogic OAuth para fazer a coisa do OAuth.

O plug -in OAuth fornece alguns ajudantes para renderizar o botão de entrada: OAuth_Login_Button e OAuth_Register_Button. Juntamente com as lógicas AuthLogic e a solicitação do plug -in, esses dois botões de alguma forma criam a sessão/usuário.

O que acontece a seguir é o seguinte: - Se eu usar o ajudante OAuth_Login_Button, o objeto de sessão falha em salvar, pois não há esse usuário localmente. - Se eu usar o Helper OAuth_register_button, em qualquer login após o primeiro, o Rails reclama que o token já foi levado ... Isso significa que não pode criar a segunda cópia para o mesmo usuário, o que está certo.

A questão é: não quero ter botões de registro e login no meu site.

No lado do usuário, o que eu quero alcançar é um único botão na página inicial, dizendo SMTH. Como "Entrar no Twitter", que o usuário deve clicar para prosseguir para as páginas internas do site.

No lado do servidor, quero criar implicitamente a conta de usuário local, se o usuário for um visitante pela primeira vez no meu site.

Alguma dica sobre como fazer isso?

Todas as amostras do AuthLogic+Oauth, que pude encontrar, não parecem se importar em ter apenas um único botão para entrar. :(

Foi útil?

Solução

Parece que vou responder à pergunta.

Eu uso o código a seguir para gerar o botão de entrada (em haml):

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

E então eu simplesmente crio o objeto de sessão do usuário no método Criar da classe UsuáriosController, se o usuário já existir:

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

Se o usuário for um visitante pela primeira vez, o objeto do usuário será salvo com sucesso na linha A. e, se não for, e há um token OAuth disponível, tentamos buscar o usuário no banco de dados e registrar -o.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top