Criação implícita do usuário com plugin autlogic e autlogic outh
-
19-09-2019 - |
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. :(
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.