Неверная строка формата в _generate_jwt_token
Это учебник, по которому я следую, ссылка
https://thinkster.io/tutorials/django-json-api/authentication
Как видно из заголовка, я получаю эту ошибку "Неверная строка формата" в этой строке:
'exp': int (dt.strftime ('%s'))
из _generate_jwt_token.
Я посмотрел документацию по strftime, и такого формата "%s" нет, есть заглавная S ("%S"), я изменил формат на заглавную S, но я получаю сообщение об ошибке при попытке декодировать токен авторизации, где я получаю следующую ошибку
{"user": {"detail": "Недопустимая аутентификация. Не удалось декодировать токен."}}
Если я оставляю строчные буквы s, я получаю ошибку "Неверная строка формата".
(authentication/backends.py)
def _authenticate_credentials(self, request, token):
"""
Try to authenticate the given credentials. If authentication is
successful, return the user and token. If not, throw an error.
"""
try:
payload = jwt.decode(token, settings.SECRET_KEY)
except:
msg = 'Invalid authentication. Could not decode token.'
raise exceptions.AuthenticationFailed(msg)
(authentication/models.py)
def _generate_jwt_token(self):
"""
Generates a JSON Web Token that stores this user's ID and has an expiry
date set to 60 days into the future.
"""
dt = datetime.now() + timedelta(days=60)
token = jwt.encode({
'id': self.pk,
'exp': int(dt.strftime('%s'))
}, settings.SECRET_KEY, algorithm='HS256')
return token.decode('utf-8')
Я ожидаю, что следующий токен "Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwiZXhwIjo0fQ.TWICRQ6BgjWMXFMizjNAXgZ9T2xFnpGijqwKQhwhhhhh"
3 ответа
Так должно быть:
token = jwt.encode({
'id': self.pk,
'exp': dt.utcfromtimestamp(dt.timestamp()) #CHANGE HERE
}, settings.SECRET_KEY, algorithm='HS256')
Это потому, что jwt сравнивает время истечения срока со временем utc. Вы можете дважды проверить правильный секретный ключ, используя инструмент отладки jwt здесь: https://jwt.io/
Подробнее читайте здесь: https://pyjwt.readthedocs.io/en/latest/usage.html
Я также застрял здесь, и именно%s, который зависит от платформы, вызвал ошибку. Я изменил это на%S (примечание капитала)
Пробовал многие из предложенных ответов, но безуспешно. Наконец удалось заставить его работать с:
def _generate_jwt_token(self):
dt = datetime.now() + timedelta(days=60)
token = jwt.encode({
'id': self.pk,
'exp': int(dt.timestamp()) #HERE
}, settings.SECRET_KEY, algorithm='HS256')