1

我在我的 Rails 中使用 Devise 进行 auth 和 devise_invitable 向用户发送邀请。

我在登台和生产环境中遇到了一个奇怪的问题。这是我们本地环境或开发环境中没有出现的东西。环境之间的一个显着区别是,暂存环境和生产环境在应用服务器前面有负载平衡器,但其余设置是相似的。

当用户点击邀请链接(其中包含作为参数的原始令牌)时,看起来是随机的,原始令牌将在查找之前被散列到一个完全不同的值,从而导致查找失败。以下是一些示例日志。

数据库中的令牌:

5d44e5c9175eebbd93737ad9db2bc83fe252c89218e6767a42c1ff8b85dd8029

请求 1(失败)

Started GET "/organizations/7/invitation/accept?invitation_token=FopqamFqA7zhXgXkQXQ7" for 50.156.8.77 at 2014-10-03 17:40:28 +0000
Processing by InvitationsController#edit as HTML
Parameters: {"invitation_token"=>"FopqamFqA7zhXgXkQXQ7", "id"=>"7"}
User Load (1.6ms)  SELECT  `users`.* FROM `users`  WHERE `users`.`invitation_token` = 'cf7f5029d134035c196739e8c5be9a9cdc54ad3fb9ae349f6567d29aea8b7165'  ORDER BY `users`.`id` ASC LIMIT 1
Filter chain halted as :resource_from_invitation_token rendered or redirected

请求 2(成功)

Started GET "/organizations/7/invitation/accept?invitation_token=FopqamFqA7zhXgXkQXQ7" for 50.156.8.77 at 2014-10-03 17:49:41 +0000
Processing by InvitationsController#edit as HTML
Parameters: {"invitation_token"=>"FopqamFqA7zhXgXkQXQ7", "id"=>"7"}
User Load (1.5ms)  SELECT  `users`.* FROM `users`  WHERE `users`.`invitation_token` = '5d44e5c9175eebbd93737ad9db2bc83fe252c89218e6767a42c1ff8b85dd8029'  ORDER BY `users`.`id` ASC LIMIT 1

请求 3(失败)

Started GET "/organizations/7/invitation/accept?invitation_token=FopqamFqA7zhXgXkQXQ7" for 50.156.8.77 at 2014-10-03 17:54:58 +0000
Processing by InvitationsController#edit as HTML
Parameters: {"invitation_token"=>"FopqamFqA7zhXgXkQXQ7", "id"=>"7"}
User Load (1.2ms)  SELECT  `users`.* FROM `users`  WHERE `users`.`invitation_token` = '69e87f81483b22c5be1a1b93dcb6fcebcd8396b172b7a85cbf17cb0ba5784cc8'  ORDER BY `users`.`id` ASC LIMIT 1
Filter chain halted as :resource_from_invitation_token rendered or redirected

这是我的邀请控制器的编辑方法的样子:

def edit
    if resource.present? && resource.organization.present?
      @guest_organization = resource.organization
    end
    super
end

相关版本:ruby 2.1.2、rails 4.1.0、devise 3.2.4、devise_invitable 1.3.4

从日志中可以看出,参数中的原始令牌是相同的,但哈希值每次都不同。我(不幸的是)无法在开发人员或本地复制它。

有没有人遇到过这样的事情?

4

1 回答 1

1

Devise 使用应用程序的 secret_key_base 来生成摘要

我的设置是这样的:

Ginseng::Application.config.secret_token = "#{SecureRandom.hex(64)}"
Ginseng::Application.config.secret_key_base = "#{SecureRandom.hex(64)}"

因此,secret_key_base 会随着每次部署/重新启动而改变,并且在每个应用服务器上都不同 - 导致哈希令牌不匹配。

将 secret_token.rb 更改为:

Ginseng::Application.config.secret_token = ENV['secret_token']
Ginseng::Application.config.secret_key_base = ENV['secret_key_base']

解决了这个问题。

于 2014-10-09T18:27:21.337 回答