2013-09-06 44 views
40

Giải phápNâng cấp để đưa ra 3.1 => nhận được Thiết lập lại mật khẩu thẻ không hợp lệ

Nhờ gist hình thức này Steven Harman, tôi đã nhận nó làm việc. 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 

tôi đã thêm các tập tin devise_mail_helpers.rb vào thư mục tương tự như các tính năng kỹ thuật và viết spec này.

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 

Điều này đảm bảo thông số kỹ thuật, làm cho trình duyệt hoạt động trong trình duyệt xem câu trả lời của Dave bên dưới.

Câu hỏi gốc

Trong ray của tôi 4 ứng dụng, tôi đã nâng cấp devise đến 3.1 và chạy rails s, sau đó tôi nhận điều này:

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

tôi thêm chìa khóa bí mật để initializer devise .

Sau này tôi nhận được lỗi sau khi tôi cố gắng để thiết lập lại mật khẩu

Reset password token is invalid 

Nó có vẻ như các token được gửi trong email là không đúng. Mọi thứ khác đang hoạt động. Tôi đăng nhập vào và ra như một con dao máng ấm áp.

Cập nhật

Bây giờ tôi đoán rằng nó đã nhận được một cái gì đó với mã hóa của reset_password_token đây từ tính năng spec:

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") 

lỗi xảy ra là:

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" 

Bất kỳ ý tưởng nào về những gì tôi đang thiếu?

Trả lời

91

Bạn đã nhận xét về my similar question một chút trước và tôi đã tìm thấy câu trả lời có thể giúp bạn.

Nâng cấp lên Devise 3.1.0 để lại một số 'cruft' theo quan điểm mà tôi đã không chạm vào một lúc. Theo số this blog post, bạn cần thay đổi người gửi thư Devise của mình để sử dụng @token thay vì số @resource.confirmation_token cũ.

Tìm trong app/views/<user>/mailer/reset_password_instructions.html.erb và thay đổi nó thành một cái gì đó như:

<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> 

này nên sửa chữa bất kỳ vấn đề xác nhận thẻ của bạn đang gặp phải. Điều này có khả năng khắc phục mọi sự cố mã thông báo mở khóa hoặc xác nhận.

+0

Đây là giải pháp đúng để làm cho nó hoạt động trên trình duyệt, nhưng làm thế nào để kiểm tra nó? –

+0

Trong nháy mắt, kiểm tra Rspec của bạn ở trên trông giống như nó nên làm các trick. Giả sử sự cố 'mã thông báo không hợp lệ' đã biến mất và nếu nó không thành công tại một vị trí cụ thể, bạn nên chia sẻ lỗi. Về mặt chiến lược, việc kết hợp Rspec hoặc Cucumber với email_spec sẽ cho phép bạn tự động kiểm tra điều này. Câu hỏi liên kết của tôi và [wiki này] (https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Cucumber) có thêm thông tin về cách kiểm tra Devise with Cucumber. –

+0

bài kiểm tra đang trôi qua. Trước khi tôi khắc phục sự cố, nó đã bị lỗi với 'mã thông báo không hợp lệ'. –

7

Tôi đoán bạn đã nâng cấp Devise lên v3.1 chứ không phải v3.01, vì config.secret_key. Vì vậy, tôi nghĩ rằng nó là bằng cách nào đó liên quan đến tính năng mới devise - bí mật quan trọng.
tôi thấy hai cam kết cho tính năng khóa bí mật mà có thể hữu ích để hiểu rõ hơn: https://github.com/plataformatec/devise/commit/32648027e282eb4c0f4f42e9c9cc0c961765faa8 https://github.com/plataformatec/devise/commit/d56641f514f54da04f778b2a9b816561df7910c2

Có lẽ bạn sẽ tìm thấy một cái gì đó hữu ích cho bạn trên http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ là tốt.
Bạn cũng có thể grep reset_password_token trên https://github.com/plataformatec/devise/compare/v3.0...v3.1.0.

EDIT
đọc trên http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/:

  • Các lập mưu bưu phẩm tại nhận một đối số thêm thẻ trên mỗi phương pháp . Nếu bạn đã tùy chỉnh người gửi thư, bạn sẽ phải cập nhật nó.Tất cả lượt xem của người gửi cũng cần phải được cập nhật để sử dụng @token, như được hiển thị here, thay vì nhận mã thông báo trực tiếp từ tài nguyên;
+0

Cảm ơn! Tôi đã nghiên cứu thêm một chút. Tôi biết về những thay đổi đối với việc xử lý mã thông báo trong Devise. Vì vậy, tôi phải làm việc trong trình duyệt. Nhưng, làm thế nào để kiểm tra nó ?. Có một số mẹo trong nhận xét trên [blog] (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/) .Bằng cách Tôi đã sửa lỗi đánh máy 3.01 thành 3.1. –

7

Tôi gặp lỗi này về thông số kỹ thuật. Tôi đã cố gắng đặt thủ công reset_password_token trên Người dùng để tôi chỉ có thể chuyển mã thông báo cho số edit_user_password_path. Tuy nhiên, mã thông báo đặt lại được băm, do đó, đặt mã theo cách thủ công sẽ không hoạt động. Rất tiếc! Để tránh lỗi này, tôi đặt reset_token bằng với mã thông báo thực tế được tạo ra được trả về bởi user.send_reset_password_instructions.

đặc tả làm việc:

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 
+0

Điều này cần phải có nhiều phiếu bầu: D – trueinViso

8

FYI, nếu bạn đang cố gắng để gửi một mã thông báo thiết lập lại mật khẩu qua phương tiện khác (bưu phẩm tức là khác nhau), bạn có thể sử dụng mã như thế này (đào ra khỏi nguồn lập mưu), trong lớp tài khoản của bạn:

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 
+0

Điều quan trọng là 'self.reset_password_token = enc' và đặt' @token = raw'. Cảm ơn bạn rất nhiều ~! – Mirror318

1

trong devise mẫu thiết lập lại mật khẩu của bạn hãy chắc chắn rằng nội dung sau đây cần sửa:

= link_to 'Thay đổi mật khẩu của tôi', edit_password_url (@resource,: reset _password_token => @token)

1

Như những người khác đã lưu ý: lý do là chế độ xem tạo thư có liên kết đặt lại mật khẩu cần phải được thay đổi.

Tôi thấy lỗi này vì tôi vẫn đang sử dụng đá quý devise-i18n-views, tạo liên kết cũ. Loại bỏ viên đá quý đó và dựa vào các khung nhìn hiện nay là một phần của đá quý devise-i18n đã giải quyết được vấn đề cho tôi.