【问题标题】:Using omniauth-google-oauth2 in rails API在 Rails API 中使用omniauth-google-oauth2
【发布时间】:2020-11-10 05:45:30
【问题描述】:

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

我将此行添加到我的 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 和密码。

这是我的谷歌函数

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 获得的访问令牌。 如果我对令牌进行硬编码,如何从该令牌访问用户信息?

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

【问题讨论】:

    标签: ruby-on-rails rubygems ruby-on-rails-5 omniauth-google-oauth2


    【解决方案1】:

    希望你没事。

    最后,我得到了解决方案,因为我很困惑如何从我从前端收到的 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 时的后端。

    【讨论】:

      【解决方案2】:

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

      Here 是一个很好的 JWT 教程,如果你使用 headless rails

      Here我们链接到可以为您提供login_user(@user)功能的设备gem

      Video tutorial about oauth

      【讨论】:

      • 谢谢,但由于我的工作只是在后端,所以我怎样才能在 request.env["omniauth.auth"] 中获取用户信息
      • 此流程用于用户注册。创建用户后,您可以创建其他端点来访问信息以及请求,您应该传递生成的访问令牌来验证请求。
      • 对不起,我正在学习,我应该在此处传递该令牌 User.from_omniauth(token) 而不是 request.env["omniauth.auth"]
      • 这可能会有所帮助railscasts.com/episodes/…
      猜你喜欢
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多