在 rails API 中使用 omniauth-google-oauth2

Using omniauth-google-oauth2 in rails API

我正在尝试在 Rails API.

中实现从 google 登录的功能

我将此行添加到我的 device.rb

config.omniauth :google_oauth2, Rails.application.credentials.dig(:google, :google_client_id),
  Rails.application.credentials.dig(:google, :google_client_secret), scope: 'userinfo.email,userinfo.profile' 

我还在我的凭据中添加了客户端 ID 和密码。

这是我的 Google 函数

def google
    @user = User.from_omniauth(request.env["omniauth.auth"])
end

这是我的 from_omniauth 来自 User.rb

的函数
def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
  end
end

因为我正在实施 API,我不知道我应该使用 request.env["omniauth.auth"] 还是硬编码我从 OAuthPlayground 获得的访问令牌。 如果我对令牌进行硬编码,我如何从该令牌访问用户信息?

我还在我的应用程序中使用 Devise 进行身份验证,遵循本教程: https://www.digitalocean.com/community/tutorials/how-to-configure-devise-and-omniauth-for-your-rails-application

此时 @user = User.from_omniauth(request.env["omniauth.auth"]) 创建用户或发现您需要根据用户数据生成 JWT 访问令牌(用于 API)或 login_user(@user) 如果您使用会话。

Here 如果您使用无头 rails

,那么对于 JWT 来说是一个很好的教程

Here 我们向设备 gem 提供 link 可以为您提供 login_user(@user) 功能

Video tutorial about oauth

希望你一切都好。

最后,我得到了解决方案,因为我很困惑如何从从前端接收的 token_id 中获取数据,因为从前端发送姓名和电子邮件不是有效的方式因为任何人都可以更改它并且可以使用错误的姓名和电子邮件注册自己。

在此之后将 gem Httparty 添加到您的 Gemfile 中。

您将通过 google 从前端获得此 token_id 或者您可以通过 Google-OAuthplayground 获得此用于测试目的并可以由邮递员测试。

现在在用户控制器中添加功能

require 'httparty'                                                             
require 'json'                                                                                                                  
class UsersController < ApplicationController                              
  include HTTParty

     def google_oauth2
       url = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=#{params["id_token"]}"                  
       response = HTTParty.get(url)                   
       @user = User.create_user_for_google(response.parsed_response)      
       tokens = @user.create_new_auth_token                      
       @user.save
       render json:@user
     end
    end

或者通过使用 access_token 获取用户信息,您可以将 URL 替换为

url = "https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=#{params["access_token"]}"

并将以下函数添加到您的 User.rb

def self.create_user_for_google(data)                  
  where(uid: data["email"]).first_or_initialize.tap do |user|
    user.provider="google_oauth2"
    user.uid=data["email"]
    user.email=data["email"]
    user.password=Devise.friendly_token[0,20]
    user.password_confirmation=user.password
    user.save!
  end
end  

现在只需点击邮递员的 URL,希望一切顺利。 如果您有任何疑问,请发表评论。

注意:此解决方案仅适用于后端,同时创建 Rails API。