2012-04-02 38 views
6

Tôi đang phát triển ứng dụng Rails 3.0 và đang sử dụng OmniAuth + Identity để xác thực đăng ký. Tôi đã triển khai một mô hình User gắn liền với mô hình Identity thông qua khóa ngoài và mọi thứ đều hoạt động tốt. Bây giờ, tôi muốn thực hiện một tính năng quên mật khẩu.OmniAuth + Identity Quên mật khẩu

Cho email của người dùng, tôi muốn gửi email cho họ kèm theo liên kết để đặt lại mật khẩu của họ. Email chứa chuỗi hex ngẫu nhiên được liên kết với người dùng.

Bây giờ, làm cách nào để đặt lại mật khẩu Identity của người dùng?

Trong bảng Cơ sở dữ liệu danh tính, nó được lưu trữ dưới dạng mật khẩu. Tôi có thể ghi đè lên điều này không?

Trả lời

4

Vì vậy, hóa ra nó thật đơn giản. Chỉ cần ghi đè lên password_digest hiện có trong bảng Identity. Sử dụng thư viện bcrypt để tạo ra các password_digest:

require 'bcrypt' 
... 
class UsersController < ApplicationController 
    ... 
    def update 
    @user = User.find(params[:id]) 
    ... 
    user_identity = Identity.find_by_email(@user.email) 
    unencrypted_password = params[:user][:password].to_s 
    password_digest = BCrypt::Password.create(unencrypted_password) 
    user_identity.password_digest = password_digest; 
    user_identity.save! 
    end 
end 
10

Làm điều này:

@identity = Identity.find(1) 
@identity.password = "newpassword" 
@identity.password_confirmation = "newpassword" 
@identity.save 

Trong một omniauth-sắc của issue, wdspkr nói:

Một khi bạn hiểu rằng omniauth-sắc là bằng cách sử dụng SecurePassword của ActiveModel, thật dễ dàng để giải quyết vấn đề này. Thay vì đặt mật khẩu , bạn chỉ cần đặt mật khẩu và xác nhận password_confirmation và .

Các vấn đề liên quan