40

解決

このgist form Steven Harman のおかげで、うまくいきました。devise_mail_helpers.rb

module Features
  module MailHelpers

    def last_email
      ActionMailer::Base.deliveries[0]
    end

    # Can be used like:
    #  extract_token_from_email(:reset_password)
    def extract_token_from_email(token_name)
      mail_body = last_email.body.to_s
      mail_body[/#{token_name.to_s}_token=([^"]+)/, 1]
    end

  end
end

devise_mail_helpers.rb機能仕様と同じフォルダーにファイルを追加して、この仕様を作成しました。

require 'devise_mail_helpers.rb'
include Features
include MailHelpers
describe "PasswordResets" do
  it "emails user when requesting password reset" do
    user = FactoryGirl.create(:user)
    visit root_url
    find("#login_link").click
    click_link "Forgot your password?"
    fill_in "Email", :with => user.email
    click_button "Send instructions"
    current_path.should eq('/users/sign_in')
    page.should have_content("You will receive an email with instructions about how to reset your password in a few minutes.")
    last_email.to.should include(user.email)
    token = extract_token_from_email(:reset_password) # Here I call the MailHelper form above
    visit edit_password_url(reset_password_token: token)
    fill_in "user_password", :with => "foobar"
    fill_in "user_password_confirmation", :with => "foobar1"
    find('.signup_firm').find(".submit").click
    page.should have_content("Password confirmation doesn't match Password")
  end
 end

これにより仕様が処理され、ブラウザーで機能するようにするには、以下の Dave の回答を参照してください。

元の質問

Rails 4 アプリで、devise を 3.1 にアップグレードして実行したrails sところ、次のようになりました。

`raise_no_secret_key': Devise.secret_key was not set. 
 Please add the following to your Devise initializer: (RuntimeError)
 config.secret_key = '--secret--'

デバイス初期化子に秘密鍵を追加しました。

この後、パスワードをリセットしようとすると、次のエラーが表示されます

Reset password token is invalid

メールで送信されるトークンが正しくないようです。他のすべてが機能しています。私は暖かいナイフトラフバターのようにログインおよびログアウトします.

アップデート

reset_password_tokenここで、機能仕様からの Here の暗号化を使用する必要があると思います。

user = FactoryGirl.create(:user, 
 :reset_password_token => "something", 
 :reset_password_sent_at => 1.hour.ago)
visit edit_password_url(user, :reset_password_token => 
  user.reset_password_token)
fill_in "user_password", :with => "foobar"
click_button "Change my password"
page.should have_content("Password confirmation doesn't match Password")

発生したエラーは次のとおりです。

Failure/Error: page.should have_content
("Password confirmation doesn't match Password")        
expected to find text "Password confirmation doesn't match Password" in 
"Reset password token is invalid"

私が欠けているものについてのアイデアはありますか?

4

6 に答える 6

91

少し前に私の同様の質問にコメントしましたが、あなたにも役立つ回答が見つかりました。

Devise 3.1.0 へのアップグレードにより、しばらく触れていなかったビューに「残骸」が残りました。このブログ投稿によると、Devise メーラーを@token古いものではなく使用するように変更する必要があります@resource.confirmation_token

これを見つけて、app/views/<user>/mailer/reset_password_instructions.html.erb次のように変更します。

<p>Hello <%= @resource.email %>!</p>
<p>Someone has requested a link to change your password, and you can do this through the link below.</p>
<p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token) %></p>
<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

これにより、発生しているトークンベースの確認の問題が修正されます。これにより、ロック解除または確認トークンの問題も解決される可能性があります。

于 2013-09-07T16:01:46.373 に答える
7

仕様上、このエラーが発生しました。Userに手動で設定しようとしていreset_password_tokenたので、トークンをに渡すことができましたedit_user_password_path。ただし、リセット トークンはハッシュ化されているため、手動で設定しても機能しません。おっとっと!このエラーを回避するためreset_tokenに、 によって返される実際に生成されたトークンと等しくなるように設定しましたuser.send_reset_password_instructions

作業仕様:

require 'spec_helper'

feature 'User resets password' do
  scenario 'fills out reset form' do
    user = create(:user)
    reset_token = user.send_reset_password_instructions
    new_password = 'newpassword!'
    visit edit_user_password_path(user, reset_password_token: reset_token)

    fill_in :user_password, with: new_password
    fill_in :user_password_confirmation, with: new_password
    click_button 'Change my password'

    expect(page).to have_content(
      'Your password was changed successfully. You are now signed in.'
    )
  end
end
于 2013-09-23T01:45:42.700 に答える
7

Devise を v3.01 ではなく v3.1 にアップグレードしたと思いますconfig.secret_key。だから、それは何らかの形で新しいデバイスの機能である秘密鍵に関連していると思います。理解を深める
のに役立つ秘密鍵機能の 2 つのコミットを見つけました

おそらく、 http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/でも役立つものが見つかるでしょう。
また、 https://github.com/plataformatec/devise/compare/v3.0...v3.1.0でreset_password_tokenをgrep できます。

編集http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/
で読む:

  • Devise メーラーは、各メソッドで追加のトークン引数を 1 つ受け取るようになりました。Devise メーラーをカスタマイズしている場合は、それを更新する必要があります。リソースから直接トークンを取得する代わりに、ここに示すように、すべてのメーラー ビューを更新して @token を使用する必要もあります。
于 2013-09-07T11:10:30.507 に答える
1

デバイスのリセット パスワード テンプレートで、次の内容が正しいことを確認してください。

=link_to 'パスワードを変更', edit_password_url(@resource, :reset_password_token => @token)

于 2014-10-17T09:30:50.717 に答える