如何在 devise_token_auth 中成功 Oauth2 授权后将登录信息发送到前端?

问题描述

我使用 devise_token_auth 进行电子邮件和基于 Google Oauth2 的身份验证(为此使用了 omniauth-google-oauth2 gem)。我已经成功地存储了用户通过 Google Oauth2 流程注册/登录登录信息。信息包括

{"auth_token"=>"token here","client_id"=>"client id here","uid"=>"uid here","expiry"=>1620492005,"config"=>nil,"oauth_registration"=>true}

以上信息的流程是

  1. 访问 http://localhost:3000/auth/google_oauth2。这会将您重定向到 Google 身份验证屏幕
  2. 用户选择帐户并授予权限。
  3. 来自我的应用的 Oauth 成功回调在 http://localhost:3000/auth/google_oauth2/callback 处执行

第一步执行的代码

module DevisetokenAuth
  class OmniauthCallbacksController < DevisetokenAuth::ApplicationController
    attr_reader :auth_params

    before_action :validate_auth_origin_url_param
    
    def omniauth_success
      get_resource_from_auth_hash
      set_token_on_resource
      create_auth_params

      if confirmable_enabled?
        # don't send confirmation email!!!
        @resource.skip_confirmation!
      end

      sign_in(:user,@resource,store: false,bypass: false)

      @resource.save!

      yield @resource if block_given?

      render_data_or_redirect('deliverCredentials',@auth_params.as_json,@resource.as_json)
    end
  end
end

我面临的问题:

  1. sign_in 方法调用没有设置 @current_user,尽管 @resource@auth_params 包含所有必要的信息。
  2. 如何将登录信息(令牌、client_id、uid)通知我的前端应用?
render_data_or_redirect('deliverCredentials',@resource.as_json)

调用不会重定向或呈现任何内容,而是停留在其显示的 URL 为 http://localhost:3000/auth/google_oauth2/callback# 的同一页面

我现在基本上有三个问题:

  1. 如何使用 devise_token_auth 根据传入的身份验证标头设置 current_user? 我已将以下行添加到我的控制器中,但仍然无法设置 @current_user
include DevisetokenAuth::Concerns::SetUserByToken

也许是因为我发送的身份验证标头不正确?请参阅下面我的第三点。

  1. 我应该如何将登录信息发送到我的前端应用程序? 我是否以某种方式修改了上述方法以将登录信息发送到我的前端应用程序?

  2. 为了发出经过身份验证的请求,我应该将 auth 标头放在什么位置?

  • devise_token_auth 与电子邮件一起用作身份验证提供程序时,我必须发送 3 个部分才能发出经过身份验证的请求,即 access-tokenclient_iduid
  • 现在,对于 Google/Facebook 等提供商,我是否设置所有这些标头?

我已经使用邮递员测试了以下两个,但由于未授权错误而失败

  1. 在标头中发送 access-tokenclient_iduid
  2. 在授权标头中发送 Bearer my_token

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...