您的帮助是非常感谢和宝贵的。如果你花一些时间阅读这一问题,并最终作出回应,提前感谢你。
我使用的是一个标准的身份验证系统,它在cookie中存储了user_id和remember_token,当填写登录表单时,会为这个用户生成一个新的令牌,并存储在cookie中,如下所示:
# Remembers a user in a persistent session.
def remember(user)
user.remember # Generates a remember token + digest and saves the digest on the user side
cookies.signed.permanent[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
我注意到了这个问题,在提交了带有正确登录信息的表单后,用户总是被立即重定向回登录页面。
这是因为当到达sessions#create之后的操作时,user_id和remember_token为nil。它们也没有出现在浏览器的控制台中(在Safari和Chrome上试过,结果相同)。我以为cookie在重定向过程中丢失了。
但更进一步,我尝试在任何重定向之前直接在常规的“get”操作上写入cookie:
class SessionsController < ApplicationController
def new
cookies[:hello] = {value: 'store_me_please', expires: 10.years.from_now}
cookies.permanent[:a_true_cookie] = true
cookies.permanent.signed[:remember_me] = 123
session[:hello] = 'store_me_in_session_please'
if logged_in?
redirect_to user_path(current_user)
else
render layout: "unauthenticated"
end
end
end
并注意到浏览器中的cookie存储在访问操作时总是保持为空,不会写入任何内容。
我认为这可能是由于csrf保护问题造成的,因为rails可以在令牌认证失败时清除会话,所以我在application_controller中注解掉了“protect_from_forgery”,但没有看到任何变化。
secret_key_base似乎已在新的credites.yml文件中;尽管这是我处理此类问题的第一个Rails5.2应用程序,所以我可能在配置中遗漏了一些东西。
我还向application.rb添加了以下配置行,它会在提交表单时触发一个“ActionController::InvalidAuthenticityToken”异常,尽管使用了“#protect_from_forgery with::exception”行被注解掉。
config.session_store :cookie_store
在我看来,Rails应用程序从来没有将cookie发送到浏览器。是什么导致了这种行为?
1条答案
按热度按时间fykwrbwg1#
我找不到任何解决这个问题的方法,也找不到确切的原因。我的直觉是以下可能的原因(仅用于文档目的,以防有人遇到同样的问题):- secret_key_base损坏导致Cookie签名问题-secret_key_base损坏或干扰验证令牌也会导致CSRF/CORS问题,导致rails在发送响应之前关闭Cookie。-某些配置设置未正确设置,妨碍正常执行。
我花了3天的时间试图诊断是什么导致了这个问题,但仍然很不幸。我唯一能想到的解决办法是将这个不起作用的应用程序的所有文件转移到一个功能正常的应用程序的副本中,配置几乎相同。这个过程花了一个小时,解决了这个问题-但唉,没有给予原因。