Ruby on rails 在rails API中使用omniauth-google-oauth2
我正在尝试在Rails API中实现从google登录的功能 我将这一行添加到我的设备。rbRuby 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
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”]这可能会有所帮助