ruby-on-rails Devise sign_in端点在第一次调用时返回格式错误的会话cookie,但在两次连续的sign_in调用时工作正常

lymnna71  于 2023-11-20  发布在  Ruby
关注(0)|答案(1)|浏览(116)

好的,我们有一个应用程序,它一直工作得很好。几周前,一个(现在是前)雇员做了一个相当大的改变,似乎引起了一个相当奇怪的错误,我试图找出实际的问题是什么,当然解决它。
简而言之,下面是一个失败的场景:

POST登录和获取用户信息

在应用程序中,我们使用device(我相信是4.6.2版)来验证用户,使用CanCanCan来授权资源,使用Ahoy来跟踪某些类型的用户(在本例中是管理员)。
对于我们遇到的故障,我们有两条相关的路径:

  1. /users/sign_in <-这是一个设计路由
  2. GET /user <-这是一个返回有关当前用户的一些相关信息的路由,包括用户角色和JWT标记,用户可以使用该标记执行API调用
    GET /user端点定义在控制器中:UsersController < V2::ApplicationController,应用程序控制器中有几个钩子,相关的钩子是:before_action :authenticate_user!, :update_current_session,其中update_current_session看起来像这样:
def current_session
    return unless current_user
    @current_session ||= current_user.sessions.find_by_session_id(cookies.signed[:_session_id])
end

def update_current_session
    return unless current_session
    current_session.accessed!(request)
end

字符串
因此,据我所知,authenticate_user!使用devet,然后调用update_current_session函数。

快乐之流-以前的工作原理:

我们有一些内部测试/脚本需要/user返回的令牌,因为它们执行对应用程序的API调用。
1.对/users/sign_in执行POST调用,其主体如下所示

{
    "user": {
            "email": "[email protected]",
            "password": "whatever"
    }
}


1.车身success: "true"得到200 OK响应。
1.这将设置一些Cookie(响应具有一些Set-Cookie标头:

Set-Cookie: ahoy_visit=[REDACTED]; path=/; expires=Mon, 20 Apr 2020 13:34:21 GMT; HttpOnly
Set-Cookie: _session_id=[REDACTED]; path=/; expires=Mon, 20 Apr 2020 10:34:21 GMT; HttpOnly
Set-Cookie: st_session=[REDACTED]; path=/; expires=Wed, 20 May 2020 09:34:21 GMT; HttpOnly
Set-Cookie: _safe_cookies__known_cookies=ahoy_visitor%7Cahoy_visit%7C_session_id%7Cst_session; path=/; expires=Thu, 18 Apr 2030 09:34:21 GMT; HttpOnly


1.使用头Cookie调用GET /user,头Cookie是所有这些Set-Cookie参数的集合(或者是多个Cookie头,两者都可以
1.收到相关机构的200 OK响应。
最后总结:

  1. POST登录-接收一组Cookie
    1.使用Cookie调用GET /用户
    1.成功

变更后的失败次数

自从离职人员发生变更后,上述相关流程就失效了,目前的情况是:

  1. POST登录-接收一组Cookie
    1.使用Cookie调用GET /用户
    1.收到401未授权
    在试图找出问题所在(主要是通过 Postman 和一些脚本)后,我注意到了一些非常奇怪的事情:
    在第一次调用POST /users/sign_in时,st_sessioncookie似乎比以前短了。如果我们连续两次调用POST /users/sign_in,则流程正常:
  2. POST sign_in -接收一组cookie(st_session似乎格式不正确或缺少某些内容)
  3. POST sign_in again -接收一组cookie(现在st_session看起来正常)
    1.使用Cookie调用GET /用户
    1.工作-从服务器接收正确的响应
    st_session似乎与session_store.rb内部的配置有关:
Rails.application.config.session_store :cookie_store, key: 'st_session', expire_after: (Rails.env.production? ? 1.hour : 1.month), secure: Rails.env.production?

摘要

变更前,以下流程正常工作:

  1. POST登录-接收一组Cookie
    1.使用Cookie调用GET /用户
    1.成功
    更改后,流失败,并显示401:
  2. POST登录-接收一组Cookie
    1.使用Cookie调用GET /用户
    1.收到401未授权
    连续两次呼叫登入的运作方式(_I):
  3. POST登入(_I)
  4. POST再次登入(_I)
    1.使用Cookie调用GET /用户
    1.工作-从服务器接收正确的响应

调试/找出问题所在

我看了devise.rb和我们的sessions_controller,但似乎401故障发生在这些地方之外。
有人知道是什么原因导致了这个问题吗?我已经尝试调试并找到问题所在,但似乎无法取得相关进展。这似乎与Devise/Warden有关,但我对那里发生的事情不太熟悉。
我更想知道谁存储了st_session cookie,其中存储了什么,因为它似乎第一次丢失了一些东西(因为st_session),而且它似乎无法根据该值正确地验证用户。
任何帮助都是感激不尽的,甚至指导我到代码中的相关位置,我可以寻找答案/帮助调试
谢谢

nwo49xxi

nwo49xxi1#

我遇到了类似的问题,它是由Devise的:timeoutable引起的。
如果您的ApplicationController中有任何current_user调用,它们将触发身份验证过程。
由于会话超时,它将在到达会话控制器中的登录代码之前触发401错误。
我的解决方案是在sessions控制器中添加以下行:
prepend_before_action :reset_session, only: [:create]

相关问题