Русские Блоги
Используйте python для реализации JWT-аутентификации фоновой системы
В сегодняшней статье представлен метод аутентификации API, подходящий для restful + json. Этот метод основан на jwt и добавляет некоторые улучшения, заимствованные из oauth2.0.
1. Несколько распространенных способов аутентификации
Первое, что нужно понять, это то, что аутентификация и аутентификация отличаются. Аутентификация предназначена для определения легитимности пользователя, а аутентификация — для определения того, может ли уровень полномочий пользователя выполнять последующие операции. Я говорю здесь только о сертификации. Есть несколько способов аутентификации:
1.1 basic auth
Это базовая аутентификация, осуществляемая в протоколе http, который представляет собой простой метод аутентификации. Принцип заключается в добавлении строки имени пользователя и пароля (отформатированной как «имя пользователя: пароль», закодированной с помощью base64) в заголовок каждого запроса.
Этот метод эквивалентен привязке «имя пользователя: пароль» как открытого сертификата, что имеет несколько проблем:
- Каждый запрос требует имени пользователя и пароля.Если соединение не использует SSL / TLS или шифрование взломано, имя пользователя и пароль в основном открываются;
- Невозможно выйти из статуса входа пользователя;
- Срок действия сертификата не истечет, если пароль не будет изменен.
В целом этот метод отличается простотой, но небезопасностью.
1.2cookie
Сохраните результат аутентификации в файле cookie клиента и проверьте идентификационную информацию в файле cookie в качестве результата аутентификации.
Этот метод отличается удобством, требует только одной аутентификации и доступен несколько раз; вы также можете выйти из системы и установить время истечения срока действия; есть даже способы (например, установка httpOnly), чтобы избежать XSS-атак. .
Но его недостатки очевидны: использование файлов cookie — это сервис с отслеживанием состояния.
1.3 token
Протокол JWT, похоже, получил широкое распространение, JSON Web Token — метод веб-аутентификации в формате json на основе токенов. Основной принцип заключается в том, что сервер выдает токен в формате json, когда имя пользователя и пароль передаются для первой аутентификации. Последующие клиентские запросы содержат этот токен, и серверу нужно только проанализировать этот токен, чтобы определить личность и законность клиента.
Протокол JWT определяет только формат этого протокола (<a href="https://tools.ietf.org/heml/rfc7519"> RFC7519 </a>), а его метод генерации последовательности описан в протоколе JWS (https://tools.ietf.org/html/rfc7515), разделенный на три части:
1.3.1 Заголовок:
Тип объявления, вот jwt
Объявить алгоритм шифрования, как правило, напрямую использовать HMAC SHA256
Общая голова такая:
Затем base64 закодирует его.
1.3.2 полезная нагрузка:
Полезная нагрузка — это место, где размещается фактическая информация об эффективном использовании. JWT определяет несколько вещей, в том числе:
- Заявления, зарегистрированные в стандарте, такие как эмитент, получатель, время действия (exp), отметка времени (iat, выпущено в) и т.д .; это официальная рекомендация, но не требуется
- Публичное заявление
- Личное заявление
Обычная полезная нагрузка такова:
Фактически, контент в полезной нагрузке бесплатный, добавьте его в соответствии с вашими потребностями в разработке.
Ps есть небольшая проблема. Используйте TimedJSONWebSignatureSerializer пакета itsdangerous для создания последовательности токенов, exp находится в заголовке. Похоже, это нарушает правила соглашения jwt.
1.3.3 signature
Сохраняются сериализованный секретный ключ и солевой ключ. Эта часть требует, чтобы заголовок с шифрованием base64 и полезная нагрузка с шифрованием base64 использовали строку, сформированную соединением. Затем секретная комбинация с соленой информацией зашифровывается с помощью метода шифрования, объявленного в заголовке, и затем составляет третью часть jwt.
2. Требования к сертификации
Целевой сценарий — это серверная система с разделенными передней и задней частью для работы и обслуживания. Хотя она используется во внутренней сети, она также имеет определенные требования к конфиденциальности.
- API — это интерфейс restful + json без сохранения состояния, требующий аутентификации в том же режиме.
- Масштабируемость по горизонтали
- Снижение нагрузки на базу данных
- Сертификат можно аннулировать
- Сертификат может быть продлен автоматически
3. Реализация JWT
2.1 Как сгенерировать токен
Здесь используется модуль python itsdangerous, этот модуль может выполнять много работы по кодированию, одна из которых заключается в реализации последовательности токенов JWS.
genTokenSeq Эта функция используется для создания токена. Для генерации последовательности используется TimedJSONWebSignatureSerializer. Здесь ключ secret_key и значение соли считываются из файла конфигурации. Конечно, это также можно записать прямо здесь. Expires_in — это интервал тайм-аута. Этот интервал записывается в секундах и может быть установлен прямо здесь. Я решил установить его как формальный параметр метода (потому что эта функция также используется для решения проблемы 2, упомянутой ниже).
Использование этого сериализатора может помочь нам справиться с проблемами заголовка и подписи. Нам нужно только использовать s.dumps для записи содержимого полезной нагрузки. Здесь я собираюсь записать три значения в каждый токен: идентификатор пользователя, идентификатор роли пользователя и текущее время («iat» — это один из стандартных операторов регистрации JWT).
Предположим, я пишу
Токен, сгенерированный указанным выше методом,
Он состоит из header.payload.signature.
3.2 Как разобрать токен
Для анализа необходимо использовать тот же сериализатор, настроить тот же секретный ключ и соль, а также использовать метод загрузки для анализа токена. itsdangerous предоставляет различные классы обработки исключений, которые также очень удобны в использовании:
Если это SignatureExpired, вы можете сразу вернуться к истекшему;
Если это BadSignature, он представляет все другие ошибки подписи, поэтому он делится на:
- Полезная нагрузка может быть прочитана: тогда сообщение является сообщением, содержимое которого было изменено, и процесс шифрования тела сообщения правильный, и секретный ключ и соль, вероятно, будут утечкой;
- Полезные данные не могут быть прочитаны: тело сообщения напрямую изменено, а секретный ключ и соль по-прежнему должны быть в безопасности.
Приведенный выше контент написан как функция для проверки токена пользователя. Если реализовано в python flask, вы можете рассмотреть возможность изменения этой функции на декоратор, украшающий краску. Поместите декоратор @ перед всеми методами, которые должны проверять токен, и код может быть более элегантным.
Механизм проверки и вынесения решения следующий:
- Используйте зашифрованный класс, затем используйте его для дешифрования (используя предыдущий ключ и значение соли) и сохраните результат в данных;
- Если перехватывается исключение SignatureExpired, это означает, что срок действия токена истек и истек в соответствии с истекшим сроком действия в токене, и возвращается «токен истек»;
- Если это другая аномалия BadSignature, ее следует разделить на:
3.1 Если полезная нагрузка все еще завершена, проанализируйте полезную нагрузку. Если обнаружено исключение BadData, это означает, что токен был изменен, и вернуть «токен изменен»;
3.2 Если полезная нагрузка неполная, вернуть напрямую «badSignature of token»; - Если ни одно из вышеперечисленных исключений не является правильным, он может вернуть только неизвестное исключение «неправильный токен с неизвестной причиной»;
- Наконец, если данные могут быть проанализированы в обычном режиме, извлеките данные из полезной нагрузки, чтобы проверить, есть ли в ней юридическая информация (вот данные json ключей user_id и user_role), если данные недопустимы, верните «недопустимую полезную нагрузку внутри». Как только это произойдет, это означает, что вероятно утечка ключа и соли.
4. Оптимизация
Вышеупомянутый метод может обеспечить базовую аутентификацию JWT, но в фактическом процессе разработки есть и другие проблемы:
После создания токена он становится недействительным по истечении срока действия. После выпуска токена отозвать модификацию невозможно, поэтому изменение срока действия токена представляет собой сложную проблему, что отражается в следующих двух проблемах:
- Вопрос 1. Выход пользователя из системы
- Вопрос 2. Автоматическое продление токена
Как решить проблему изменения срока действия токена, я видел много дискуссий в Интернете, в основном сосредоточившись на следующем:
- JWT — это одноразовая аутентификация, которая загружает информацию в токен, а информация токена содержит информацию об истечении срока действия. Если время истечения слишком велико, риск повторного воспроизведения будет слишком велик, а если время истечения слишком короткое, опыт запрашивающего будет слишком плохим (вам придется снова войти в систему, когда захотите)
- Чтобы хранить токены в библиотеке, естественно подумать о хранении каждого токена в библиотеке, установке действительного поля, после его отмены, valid = 0; установка поля действительности, если вы хотите продлить его, увеличьте период действия. Это то, что делает openstack keystone. Хотя этот метод удобен, он создает большую нагрузку на базу данных и создает проблемы для базы данных, даже если количество посещений велико и токен выпущен больше. Более того, это также противоречит первоначальному замыслу JWT.
- Чтобы пользователям не приходилось часто входить в систему, клиент сохраняет имя пользователя и пароль (cookie), а затем использует имя пользователя и пароль для аутентификации, но необходимо учитывать проблему защиты от атак CSRF.
Здесь автор использует сторонний протокол аутентификации Oauth2.0 (<a href="https://tools.ietf.org/html/rfc6749"> RFC6749 </a>) и использует другой подход: обновить токен , Токен, используемый для обновления токена. После первой аутентификации пользователя выдаются два токена:
- Один из них — токен доступа, который используется для аутентификационной информации, передаваемой в каждом последующем запросе пользователя.
- Другой — это токен обновления, который используется для подачи заявки на новый токен доступа после истечения срока действия токена доступа.
Таким образом, можно установить два разных типа токенов с разными сроками действия.Например, токены доступа действительны только в течение одного часа, а токены обновления могут быть в течение одного месяца. Выход из API достигается за счет истечения срока действия токена доступа (внешний интерфейс может напрямую отбросить этот токен для выхода из системы). В течение срока действия токена обновления вы можете выполнить токен обновления, чтобы подать заявку на новый токен доступа (внешний интерфейс может сохранить это обновление Токен и токен доступа обновляются для достижения эффекта автоматического расширения).
Токен обновления больше не может быть продлен. По истечении срока действия вам нужно будет снова войти в систему со своим именем пользователя и паролем.
Идея этого подхода — разделить сертификат на три уровня:
- краткосрочный сертификат токена доступа, используемый для окончательной аутентификации
- токен обновления — это долгосрочный сертификат, используемый для создания краткосрочного сертификата, не используемый напрямую для запросов на обслуживание
- Имя пользователя и пароль Почти постоянные сертификаты, используемые для создания долгосрочных сертификатов и краткосрочных сертификатов, не используются напрямую для запросов на обслуживание
Таким образом, эффективность сертификата и своевременность сертификата рассматриваются вместе.
ps. Как упоминалось ранее, при создании токена expire_in (рекомендуемое поле jwt, интервал тайм-аута) используется в качестве формального параметра функции, чтобы использовать эту функцию для создания токена доступа и обновления токена. , И время expire_in у двух разное.
5. Резюме
Мы сделали модуль аутентификации JWT:
(в следующем коде токеном доступа является ‘token’, в коде — токен обновления ‘rftoken’)
Name already in use
Learn-to-program-with-Python-guide / Understanding errors / Syntax-Error-bad-token.py /
- Go to file T
- Go to line L
- Go to definition R
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Why am I getting token errors [closed]
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 9 months ago .
I am not sure why I am getting a token error statement. The error is SyntaxError: bad token T_OP on line 7
![]()
1 Answer 1
it’s the minus sign your − should be —
![]()
-
The Overflow Blog
Related
Hot Network Questions
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.6.8.43486
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Fix the SyntaxError: Invalid Token in Python
Every programming language has a set of rules and regulations known as the language syntax that needs to be followed to avoid an error. Similarly, Python has its syntax where every statement component is known as a token; white spaces separate these tokens, so the Python compiler understands and behaves accordingly.
The essential components called tokens can be variable names, keywords, operators, identifiers, delimiters, or any other built-in or user-defined features.
Let’s understand what tokens are and how whitespaces separate them.
In the above line of code, we have three different tokens, including token_demo , = , and 39 . These tokens are further separated by white space, so the Python compiler understands them and behaves accordingly.
the SyntaxError: invalid token in Python
As discussed, every programming language has some syntax rules you must follow to avoid errors. Similarly, when you use the token invalidly, the Python compiler gives you an error message specifying the error.
In Python, octal, binary, decimal, and hexadecimal are all considered as integer literals. Let’s say you want to find the data type of an octal number; it will show the data type int or similarly for binary, decimal, and hexadecimal.
Suppose you want to store the date as a tuple in the format DD,MM,YYYY .
This gives you the SyntaxError: invalid token because the syntax rules were violated. The reason is that we are not allowed to use 0 as a prefix in any numbers until and unless you have correctly defined it as hexadecimal or string.
In Python 2x, you could use 04 and 08 because it has a special meaning that the number is in the octal format. But, later on, in Python 3x, this functionality was removed; now, 0 as a prefix has no meaning.
You can either define 04,08 as a single digit number like 4,8 or a string and then type cast the string to manipulate it accordingly.