Ruby on rails 在rails API中使用omniauth-google-oauth2

Ruby on rails 在rails API中使用omniauth-google-oauth2,ruby-on-rails,rubygems,ruby-on-rails-5,omniauth-google-oauth2,Ruby On Rails,Rubygems,Ruby On Rails 5,Omniauth Google Oauth2,我正在尝试在Rails API中实现从google登录的功能 我将这一行添加到我的设备。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

我正在尝试在Rails API中实现从google登录的功能

我将这一行添加到我的设备。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和密码

这是我的谷歌功能

def google
    @user = User.from_omniauth(request.env["omniauth.auth"])
end
下面是User.rb的from_omniauth函数

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”]
还是硬编码我从OAuth获得的访问令牌。 如果我硬编码令牌,我如何从该令牌访问用户信息

根据本教程,我还在应用程序中使用Desive进行身份验证:

此时
@user=user.from_omniauth(request.env[“omniauth.auth”])
在创建或找到用户后,您需要根据用户数据生成JWT访问令牌(用于API),或者
登录用户(@user)
如果您使用会话

如果您使用无头导轨,这是JWT的一个很好的教程

向我们提供设备gem的链接,该链接可以为您提供
登录用户(@user)
功能


此时
@user=user.from_omniauth(request.env[“omniauth.auth”])
在创建或找到用户后,您需要根据用户数据生成JWT访问令牌(用于API),或者
登录用户(@user)
如果您使用会话

如果您使用无头导轨,这是JWT的一个很好的教程

向我们提供设备gem的链接,该链接可以为您提供
登录用户(@user)
功能

希望你没事

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

在此之后,将这些gem&添加到Gemfile中,并在routes.rb文件中定义自定义路由

将“auth/request”发布到:“users#google_oauth2”

确保控制器和函数名与路径中定义的名称匹配。 你可以通过谷歌从前端获得这个令牌id,或者你可以通过测试获得这个令牌id,也可以通过邮递员进行测试

现在在用户控制器中添加函数

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
现在点击邮递员的网址&我希望一切都会好起来。 如果您有任何疑问,请发表评论

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

希望您一切顺利

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

在此之后,将这些gem&添加到Gemfile中,并在routes.rb文件中定义自定义路由

将“auth/request”发布到:“users#google_oauth2”

确保控制器和函数名与路径中定义的名称匹配。 你可以通过谷歌从前端获得这个令牌id,或者你可以通过测试获得这个令牌id,也可以通过邮递员进行测试

现在在用户控制器中添加函数

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
现在点击邮递员的网址&我希望一切都会好起来。 如果您有任何疑问,请发表评论


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

谢谢,但由于我的工作仅限于后端,因此如何在request.env[“omniauth.auth”]中获取用户信息此流用于用户注册。创建用户后,您可以创建其他端点来访问请求中的信息。您应该传递生成的访问令牌来验证请求。很抱歉,我正在学习我应该在此处传递该令牌吗用户。从\u omniauth(令牌)而不是request.env[“omniauth.auth”]这可能有助于感谢您,但由于我的工作只是在后端,因此如何在request.env[“omniauth.auth”]中获取用户信息此流用于用户注册。创建用户后,您可以创建其他端点来访问请求中的信息。您应该传递生成的访问令牌来验证请求。很抱歉,我正在学习我应该在此处传递该令牌吗?用户。从\u omniauth(令牌)而不是request.env[“omniauth.auth”]这可能会有所帮助