好的,我们有一个应用程序,它一直工作得很好。几周前,一个(现在是前)雇员做了一个相当大的改变,似乎引起了一个相当奇怪的错误,我试图找出实际的问题是什么,当然解决它。
简而言之,下面是一个失败的场景:
POST登录和获取用户信息
在应用程序中,我们使用device(我相信是4.6.2版)来验证用户,使用CanCanCan来授权资源,使用Ahoy来跟踪某些类型的用户(在本例中是管理员)。
对于我们遇到的故障,我们有两条相关的路径:
/users/sign_in
<-这是一个设计路由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响应。
最后总结:
- POST登录-接收一组Cookie
1.使用Cookie调用GET /用户
1.成功
变更后的失败次数
自从离职人员发生变更后,上述相关流程就失效了,目前的情况是:
- POST登录-接收一组Cookie
1.使用Cookie调用GET /用户
1.收到401未授权
在试图找出问题所在(主要是通过 Postman 和一些脚本)后,我注意到了一些非常奇怪的事情:
在第一次调用POST/users/sign_in
时,st_sessioncookie似乎比以前短了。如果我们连续两次调用POST/users/sign_in
,则流程正常: - POST sign_in -接收一组cookie(st_session似乎格式不正确或缺少某些内容)
- 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?
型
摘要
变更前,以下流程正常工作:
- POST登录-接收一组Cookie
1.使用Cookie调用GET /用户
1.成功
更改后,流失败,并显示401: - POST登录-接收一组Cookie
1.使用Cookie调用GET /用户
1.收到401未授权
连续两次呼叫登入的运作方式(_I): - POST登入(_I)
- POST再次登入(_I)
1.使用Cookie调用GET /用户
1.工作-从服务器接收正确的响应
调试/找出问题所在
我看了devise.rb
和我们的sessions_controller
,但似乎401故障发生在这些地方之外。
有人知道是什么原因导致了这个问题吗?我已经尝试调试并找到问题所在,但似乎无法取得相关进展。这似乎与Devise/Warden有关,但我对那里发生的事情不太熟悉。
我更想知道谁存储了st_session
cookie,其中存储了什么,因为它似乎第一次丢失了一些东西(因为st_session),而且它似乎无法根据该值正确地验证用户。
任何帮助都是感激不尽的,甚至指导我到代码中的相关位置,我可以寻找答案/帮助调试
谢谢
1条答案
按热度按时间nwo49xxi1#
我遇到了类似的问题,它是由Devise的
:timeoutable
引起的。如果您的
ApplicationController
中有任何current_user
调用,它们将触发身份验证过程。由于会话超时,它将在到达会话控制器中的登录代码之前触发401错误。
我的解决方案是在sessions控制器中添加以下行:
prepend_before_action :reset_session, only: [:create]
个