最终在rails应用中想实现的效果是可以通过谷歌账号进行登录,效果如下:
在开始之前,需要去google配置一个对应的project,并且拿到对应Client ID 和 Client Secret
具体操作步骤已经有文档,可以直接打开进行
https://github.com/brunoao86/rails-third-party-auth/wiki/How-to-configure-Google-Auth-on-the-app
https://ktor.kotlincn.net/quickstart/guides/oauth.html
两篇基本一样的,可以对比看看。配置结束可以找到对应的id secret
接下来,进行rails项目中的配置使用
Gemfile添加对应的gem,当前使用的是google-api-client
gem 'google-api-client', require: 'google/apis/calendar_v3'
在config/secrets.yml中配置对应的id和secret
google_client_id: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
google_client_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
对应的html触发位置
<a href="/login/google_auth" style="margin:right">login with google</a>
对应的controller位置
# 页面触发的代码
def google_auth
client = Signet::OAuth2::Client.new(client_options)
url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(
request)
redirect_to client.authorization_uri.to_s
end
# redirect_uri 需要和Google API那边的填写的一致,不一致可能会提示错误400:redirect_uri_mismatch
def client_options
{
client_id: Rails.application.secrets.google_client_id,
client_secret: Rails.application.secrets.google_client_secret,
authorization_uri: 'https://accounts.google.com/o/oauth2/auth',
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
scope: 'https://www.googleapis.com/auth/drive',
redirect_uri: 'http://localhost:3000/auth/google_oauth2/callback'
}
end
oauth2callback的route.rb配置如下:
get '/auth/google_oauth2/callback', to: 'login#oauth2callback'
这里处理结束后,页面就可以去验证当前google账户了 ,操作完成后,还要去执行oauth2callback,处理验证通过后的后续操作。