Расшифровка и кодировка JSON в Django - PullRequest
0 голосов
/ 07 января 2019

Я следовал некоторым урокам по django и нашел некоторые неясные коды. Этот фрагмент взят из пользовательской модели, в проекте для аутентификации которой используется jwt.

Как я прокомментировал во фрагменте, я не могу заметить причину, почему они сначала кодируют данные и снова декодируют их. Я думал, что этот тип паттерна не только специфичен для этого урока, но и довольно общий паттерн. Может ли кто-нибудь объяснить мне, пожалуйста?

 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({ #first encode here
            'id': self.pk,
            'exp': int(dt.strftime('%s'))
        }, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8') #returns decoded object

1 Ответ

0 голосов
/ 07 января 2019

«Кодирование» обычно относится к преобразованию данных в их двоичное представление (байты).

JWT (JSON Web Token) * В кодировке 1006 * используется специальная структура данных и криптографическая подпись для обеспечения безопасного обмена данными с проверкой подлинности.

Шаги для кодирования данных как JWT следующие:

  1. Полезная нагрузка преобразуется в json и кодируется с использованием base64.
  2. Заголовок , указывающий тип токена (например, jwt) и алгоритм подписи для использования (например, HS256), является закодированы аналогично.
  3. A подпись получена из вашего личного ключа и двух предыдущих значений.
  4. Результат получается путем соединения заголовка, полезной нагрузки и подписи точками. На выходе получается двоичная строка .

Больше информации здесь .

При декодировании с использованием UTF-8 эта двоичная строка преобразуется в строку Unicode:

>>> encoded_bin = jwt.encode({'some': 'data'}, 'secret_sig', algorithm='HS256')
>>> type(encoded_bin)
<class 'bytes'>

>>> encoded_string = encoded_bin.decode('utf-8')
>>> type(encoded_string)
<class 'str'>

Примечания:

  • Не всегда возможно декодировать байты в строку. Кодирование Base64 ваших данных позволяет вам хранить любые байты в виде текстового представления, но закодированная форма требует больше места (+ 33%), чем ее необработанное представление.

  • Двоичная строка имеет префикс b в вашем интерпретаторе Python (например, b"a binary string")

...