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

如何解决如何在 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?