1

Rails で auth と devise_invitable に Devise を使用して、ユーザーに招待状を送信しています。

ステージング環境と本番環境で奇妙な問題が発生しました。これは、私たちのローカル環境や開発環境では発生しなかったものです。環境間の大きな違いは、ステージング環境と本番環境ではアプリ サーバーの前にロード バランサーがあることですが、残りのセットアップは似ています。

ユーザーが招待リンク (パラメーターとして raw トークンを含む) をクリックすると、一見ランダムに見えますが、ルックアップの前に raw トークンが完全に異なる値にハッシュされ、結果として失敗します。サンプル ログを次に示します。

DB のトークン:

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

Invitations Controller の edit メソッドは次のようになります。

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

ログに表示されるように、params の生のトークンは同じですが、ハッシュ値は毎回異なります。私は(残念ながら)これをdevまたはローカルで複製できません。

誰かがこのようなことに遭遇しましたか?

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 に答える