Сброс токена с помощью TimedJSONWebSignatureSerializer - PullRequest
0 голосов
/ 03 мая 2019

Я выполняю сброс пароля с помощью itsdangerous TimedJSONWebSignatureSerializer в своем приложении для фляги, при отправке адреса электронной почты я получаю следующую трассировку стека в make-header exp = iat + self.expires_in и, наконец, TypeError: unsupported operand type(s) for +: 'int' and 'str'. Что я не правильно делаю?

Я пытался изменить id на целое число, но безуспешно. Исследовано на декодирование, но это выглядит нормально.

Это мой код:

from datetime import datetime
from flask import current_app
from inventory import db, login_manager
from flask_login import UserMixin
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


class User(db.Model, UserMixin):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    fullname = db.Column(db.String(120), nullable=False)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    phone = db.Column(db.String(50), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    items = db.relationship('Items', backref='items_admin', lazy=True)
    orderitems = db.relationship('OrderItems', backref='user_order', lazy=True)

    def get_reset_token(self, expires_sec=30000):
        s = Serializer(current_app.config['SECRET_KEY'], expires_sec)
        return s.dumps({'user_id': self.id}).decode('ascii') # This is the line that throws the said error.

    @staticmethod
    def verify_reset_token(token):
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            user_id = s.loads(token)['user_id']
        except:
            return None
        return User.query.get(user_id)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.image_file}')"

Я ожидаю, что ссылка для сброса будет отправлена ​​на указанный адрес электронной почты без проблем.

1 Ответ

1 голос
/ 03 мая 2019

Вы должны убедиться, что expires_sec является целым числом при вызове get_reset_token, и вы переопределяете аргумент expires_sec.

Это потому, что когда значение expires_in, переданное экземпляру Serializer, является строкой, оно выдает исключение, как показано ниже.

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
s = Serializer('your_secret_key', expires_in="36000") # when expires_in value is a string it raises the TypeError exception.
s.dumps({'id': 'your_user_id'}).decode('ascii')

Возникает исключение, которое вы отметили выше

TypeError                                 Traceback (most recent call last)
<ipython-input-10-1f720d87ecbf> in <module>
----> 1 s.dumps({'id': '232232'}).decode('ascii')

   178         header = JSONWebSignatureSerializer.make_header(self, header_fields)
    179         iat = self.now()
--> 180         exp = iat + self.expires_in
    181         header["iat"] = iat
    182         header["exp"] = exp

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Решение: проверьте, куда вы звоните get_reset_token и убедитесь, что вы не переопределяете expires_sec строковым значением. если вы делаете это, используйте целочисленное значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...