2017-07-25 104 views
0

我正在为Rails应用程序进行Google身份验证。目前使用omniauth-google-oauth2 gem来实施Google身份验证。我设法让用户使用谷歌登录。不过,我也希望用户能够使用Google注册。我的问题是,我已经匹配谷歌回调URL到特定的控制器操作(会话#创建)。 根据用户是否登录或注册,可以在2个重定向URI之间进行选择吗?目前,我唯一的想法是创建新的谷歌客户端凭证用于注册,我希望有一个更好的方法。如何使用Google Oauth2登录用户并在Rails应用程序中创建新的用户帐户?

回答

0

你不需要有2个重定向uris,你只需要在接收回调时做更多的工作。例如:

class SessionsController < ApplicationController 

    ... 

    def create 
    email = auth_hash['info']['email'] # assuming your omniauth hash is auth_hash and you're requiring the email scope 
    @user = User.find_by(email: email) if !email.blank? # assuming your user model is User 

    if @user 
     login_user(@user) # use your login method 
    elsif !email.blank? 
     @user = User.new(name: auth_hash['info']['name'], email: email) 
     unless @user.save!(validate: false) # validate false because I'm enforcing passwords on devise - hence I need to allow passwordless register here) 
      # deal with error on saving 
     end 
    else 
     # deal with no found user and no email 
    end 
    end 

    protected 

    def auth_hash 
     request.env['omniauth.auth'] 
    end 

end 

我写的所有步骤,但创建过程可以缩短为:

@user = User.create_with(name: auth_hash['info']['name']).find_or_initialize_by(email: email) 
@user.save! if @user.new_record? 
if @user 
    login_user(@user) 
else 
    # deal with no user 
end 

然而,你不能确保用户将会给你范围访问电子邮件,所以我个人认为第一个版本,即使有点更长更强大。然后在较短的版本也有问题,if @user是错误的,为什么如此?并且需要你添加更多的逻辑来弄清为什么是这样,而在第一种情况下,对每种情况应用正确的响应要容易得多。

相关问题