Неверная строка формата в _generate_jwt_token - PullRequest
0 голосов
/ 03 февраля 2019

это учебник, по которому я иду, ссылка

https://thinkster.io/tutorials/django-json-api/authentication

Как видно из заголовка, я получаю эту ошибку "Неверная строка формата" в этой строке:

'exp': int (dt.strftime ('% s'))

из _generate_jwt_token.

Я посмотрел документацию по strftime и такого формата не существует '% s 'есть заглавная S ('% S '), я изменил формат на заглавную S, но я получаю сообщение об ошибке при попытке декодировать токен авторизации, где я получаю следующую ошибку

{"user": {"detail": "Недопустимая аутентификация. Не удалось декодировать токен."}}

Если я оставлю строчные буквы s, я получу ошибку "Invalid format string".

(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.TWICRQ6BgjWMXFMizjNAXgZ9TiK0hwq0qhqh9h9hvq0qhqh9t9h9h9tjqv9v9x2hwq0h0qh0qh0qh0h0q0qh9t9v9v9v9v9v9v9v9v9v9v9v9v9v9w9x2xwh0q0qhwq0qw9q2w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w2x9w9w2w9 также возвращает

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Должно быть:

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#encoding-decoding-tokens-with-hs256

0 голосов
/ 18 марта 2019

Я также застрял здесь, и именно% s, который зависит от платформы, вызвал ошибку.Я изменил это на% S (примечание капитала)

...