ソリューション
これのおかげで Gist 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
の暗号化を伴う何かでなければならないと思います。これは機能仕様からです:
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"
私が欠けているものについてのアイデアはありますか?
私の似たような質問 についてコメントしましたが、あなたにも役立つ答えを見つけました。
Devise 3.1.0にアップグレードすると、しばらく触れなかったビューに「残酷」が残りました。 このブログ投稿 によると、古い@token
の代わりに@resource.confirmation_token
を使用するようにDeviseメーラーを変更する必要があります。
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>
これにより、トークンベースの確認の問題が修正されます。これにより、ロック解除または確認トークンの問題も修正される可能性があります。
参考までに、別の手段(つまり、異なるメーラー)を介してリセットパスワードトークンを送信しようとしている場合、Userクラスで次のようなコードを使用できます(Deviseソースから抽出)。
def send_invitation
raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
self.reset_password_token = enc
self.reset_password_sent_at = Time.now.utc
self.save(:validate => false)
Notifier.signup_notification(contactable: self, token: raw).deliver
end
私は仕様にこのエラーがありました。ユーザーに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
Deviseをv3.01ではなくv3.1にアップグレードしたのは、config.secret_key
。だから、それは何らかの形で新しい工夫機能-秘密鍵に関連していると思います。
シークレットキー機能について、理解を深めるのに役立つ2つのコミットが見つかりました。 https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8https:// github .com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2
おそらくあなたは http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ でもあなたに役立つ何かを見つけるでしょう。
grepreset_password_tokenon https://github.com/plataformatec/devise/compare/v3.0...v3.1. .
[〜#〜] edit [〜#〜]
続きを読む http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ :
他の人が述べたように:理由は、パスワードのリセットリンクを含むメールを生成するビューを変更する必要があるためです。
古いリンクを生成するdevise-i18n-views
gemをまだ使用していたため、このエラーが表示されました。そのgemを削除し、現在devise-i18n
gemの一部であるビューに依存することで問題が解決しました。
デバイスのリセットパスワードテンプレートで、次の内容が正しいことを確認してください。
= link_to 'パスワードの変更'、edit_password_url(@resource、:reset_password_token => @token)