2012-12-16 17 views
5

Ai đó có thể hướng dẫn tôi những gì đang diễn ra trong mã thông báo đặt lại mật khẩu của bảo mật không? Mã này là ở đây trên github:Giải thích về chức năng đặt lại mật khẩu dựa trên mã thông báo trong Flask-Security

https://github.com/mattupstate/flask-security/blob/develop/flask_security/recoverable.py

(Có thể có các bộ phận khác lên một thư mục.)

hiểu biết của tôi về những gì đang xảy ra:

  1. Trong con đường xác định bởi forgot_password () người dùng gửi biểu mẫu để đặt lại mật khẩu
  2. Một "reset_password_token" được tạo. Điều này bao gồm ID của người dùng + md5() của mật khẩu hiện tại (được mã hóa được lưu trữ) của người dùng?
  3. Liên kết được tạo đến địa chỉ mật khẩu đặt lại chứa mã thông báo.
  4. Liên kết này được gửi qua email đến địa chỉ do người dùng cung cấp.email
  5. Khi người dùng nhấp vào liên kết đó, họ đi đến tuyến đường (được xác định trong chế độ xem), được đặt lại_password (mã thông báo). Giá trị mã thông báo là một đối số cho tuyến đường này.
  6. Tuyến đường đánh giá liệu mã thông báo có hợp lệ và không hết hạn hay không.
  7. Nếu có, tuyến đường này sẽ hiển thị biểu mẫu yêu cầu mật khẩu mới, ResetPasswordForm().

Điều đó có đúng không?

Ngoài ra:

  1. Nếu trên là chính xác, nó là an toàn để làm cho các thẻ chứa một md5 mới() của mật khẩu hiện tại? Tôi biết nó nên là duy nhất và tốn kém để đảo ngược, nhưng vẫn còn?
  2. Ngày hết hạn được lưu trữ ở đâu?

Tôi đang bối rối đặc biệt nhất bởi hàm generate_password_reset

data = [str(user.id), md5(user.password)] return _security.reset_serializer.dumps(data)

get_token_status(token, 'reset', 'RESET_PASSWORD') chức năng bên trong reset_password_token_status(token)

Trả lời

4

Nó được sử dụng các mô-đun itsdangerous serialize token. Nếu bạn đọc thêm về nó dưới đây, bạn sẽ có câu trả lời của bạn về cách hết hạn timestamp được sử dụng, vv

http://packages.python.org/itsdangerous/

Chức năng serializer.dumps() tạo ra một chuỗi tuần tự độc đáo và serializer.loads() được gọi bởi get_token_status sẽ trở lại trường hợp ngoại lệ trừ khi giá trị tuần tự chính xác được cung cấp cho nó dưới dạng tham số.

Vì vậy, bạn dumps() và sau đó sử dụng giá trị trả lại từ đó, bạn gọi loads(). Nếu không khớp, bạn có ngoại lệ trong trường hợp này có nghĩa là mã thông báo không hợp lệ.

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