升级到 Rails 7.1 破坏了设备身份验证,但在开发过程中却没有破坏

问题描述 投票:0回答:3

我将应用程序升级到了 Rails 7.1,并且在我的开发服务器上,使用我的 Devise 设置登录效果很好。但是,在我的临时服务器(使用 nginx 的 RHEL7)上,身份验证不再起作用。

首先,它声称无法验证authenticity_token。令牌在

<head>
以及登录表单中的隐藏字段中提供。只是为了让它工作,我尝试在本地提供的 Devise::SessionsController 中跳过_forgery_protection(没有对 gem 生成的文件进行其他修改),奇怪的是这不起作用,这是我绕过 protected_from_forgery 的唯一方法的方法是从 devise 存储库复制生成的控制器继承的 DeviseController,并将skip_forgery_protection 放入其中(即使从我的 ApplicationController 中完全删除protect_from_forgery,以及删除两个authenticity_token 标签,也无法阻止登录期间的 CSRF 错误)。

当我不再在日志中看到 CSRF 错误时,我遇到了另一个问题。我进行了身份验证,这会将我重定向到需要身份验证的页面,然后该页面会将我重定向回登录。在日志中,我看到 Devise 增加了我的用户记录的 log_in_count,因此看来身份验证已被接受。但随后它会表现得好像我没有登录一样。所以我的预感是 current_user 值没有在会话 cookie 中正确设置,所以我开始搞乱它。如果我将 cookie_store 配置设置为在开发时使用 secure: true (以前仅在非开发环境上设置为安全),我就能够在开发服务器上重新创建此症状。然而,切换 secure: false 根本没有帮助分期。

所以我有领先优势,但我已经碰壁了。看起来设计此时默默地失败了,无法存储经过身份验证的用户。但似乎如果这是一个问题,现在已经有人发现了,所以我仍然认为这是我的应用程序中的某些配置。任何想法去哪里寻找可能会导致这样的事情?

红宝石3.1.4

Rails 7.1.1

设计4.9.3

在 Chrome/Brave/Safari 上测试,没有区别。

ruby-on-rails devise ruby-on-rails-7
3个回答
0
投票

我们在类似的设置中遇到了同样的问题。 登录不起作用,但用户仍然可以通过从忘记密码恢复链接进入,然后会话工作正常。 我们的应用程序尚未从 Turbolinks 迁移到 Turbo。 它可能与: https://github.com/heartcombo/devise/wiki/How-To:-Upgrade-to-Devise-4.9.0-%5BHotwire-Turbo-integration%5D


0
投票

尽管我没有使用 Devise,但我也有一个非常相似的听起来问题。

rails 7.0.8 一切正常,但是当我升级到 7.1.1 时,尽管我的测试仍然有效并且开发应用程序看起来很好,但在生产中 POST 登录时出现异常(“无法验证 CSRF 令牌”)凭证。

与我的会话控制器中的prepend_before_action中的ActionController::RequestForgeryProtection中的代码相关的一些日志记录揭示了生产和开发之间的显着差异。两者似乎都正确地从表单接收了令牌(在 request_authenticity_tokens 中),但在生产中 compare_with_global_token 返回 false(最终导致异常),而在开发中,相同的方法返回 true(避免任何错误并最终导致成功登录) .


0
投票

我发现自从我昨天升级到 Rails 7.1.2 以来,我的每个请求都会收到一个新的会话。因此,会话中存储的所有数据都会丢失。作为“默认情况下 Devise 会将用户存储在会话中”。这也可能是您问题的原因...... 该问题仅出现在生产服务器上,但不会出现在开发中。

2023-11-15 09:24:43 +0100 #

2023-11-15 09:24:50 +0100 #

2023-11-15 09:24:51 +0100 #

© www.soinside.com 2019 - 2024. All rights reserved.