微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Rails API中使用omniauth-google-oauth2

如何解决在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-oauth2Httparty 添加到您的 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)功能

Video tutorial about oauth

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?