如何解决在Rails API中使用omniauth-google-oauth2
希望你很好。实际上,我正在尝试在Rails API中实现从Google功能登录。
我将此行添加到我的device.rb
config.omniauth :google_oauth2,Rails.application.credentials.dig(:google,:google_client_id),:google_client_secret),scope: 'userinfo.email,userinfo.profile'
我还在我的凭据中添加了客户端ID和密码。
这是我的Google功能
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"]
?
或将我从OAuthPlayground获得的访问令牌硬编码。
如果我对令牌进行硬编码,如何从该令牌访问用户信息?
因为我也在应用程序中使用该设备进行身份验证。 &遵循本教程。
https://www.digitalocean.com/community/tutorials/how-to-configure-devise-and-omniauth-for-your-rails-application
解决方法
希望你没事。
最后,我得到了解决方案,因为我很困惑如何从我从前端收到的 token_id 中获取数据,因为从前端发送姓名和电子邮件不是有效的方式,因为任何人都可以更改它和可以用错误的姓名和电子邮件注册自己。
在此之后,将这些 gem omniauth-google-oauth2 和 Httparty 添加到您的 Gemfile 中并在您的 routes.rb 文件中定义自定义路由
将“身份验证/请求”发布到:“users#google_oauth2”
确保您的控制器和函数名称应与路径中定义的名称相匹配。 您将通过 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
并将以下函数添加到您的 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 时的后端。
,此时@user = User.from_omniauth(request.env["omniauth.auth"])
被创建或发现用户后,您需要根据用户数据或login_user(@user)
(如果使用会话)来生成JWT访问令牌(用于API)。
Here是JWT的不错的教程,如果您使用无头导轨
或
Here是指向Device gem的链接,该链接可以为您提供login_user(@user)
功能
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。