Ответ
Токен — это криптографический объект, представляющий собой строку данных, которая используется для подтверждения прав доступа (аутентификации и авторизации) вместо постоянных учётных данных, таких как пароль.
Основные виды токенов:
- Access Token (Токен доступа): Короткоживущий ключ, который клиентское приложение передаёт с каждым запросом к защищённому API. Сервер проверяет его для предоставления доступа к ресурсам.
- Refresh Token (Токен обновления): Долгоживущий ключ, хранящийся безопасно (например, в HTTP-Only куках). Используется для получения нового Access Token по истечении срока его действия, не требуя повторного ввода логина и пароля.
- JWT (JSON Web Token): Популярный стандарт для токенов доступа. Это самодостаточный токен, содержащий в себе полезные данные (claims), такие как идентификатор пользователя и срок действия, в закодированном виде.
Пример создания и проверки JWT на Python (PyJWT):
import jwt
import datetime
# Секретный ключ для подписи (должен храниться безопасно на сервере)
SECRET_KEY = "your-256-bit-secret"
# Создание токена
payload = {
"user_id": 12345,
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) # Срок действия
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(f"Access Token: {token}")
# Проверка токена в API-запросе (на стороне сервера)
try:
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
print(f"Данные пользователя: {decoded_payload}")
except jwt.ExpiredSignatureError:
print("Ошибка: Срок действия токена истек.")
except jwt.InvalidTokenError:
print("Ошибка: Неверный токен.")
Практическое использование в автотестах (заголовок Authorization):
import requests
# Получение токена (например, через запрос к эндпоинту /login)
auth_response = requests.post("https://api.example.com/login", json={"login": "user", "pass": "123"})
access_token = auth_response.json()["access_token"]
# Использование токена для вызова защищённого API
headers = {
"Authorization": f"Bearer {access_token}"
}
api_response = requests.get("https://api.example.com/protected/data", headers=headers)
print(api_response.json())
Преимущества: Повышенная безопасность (пароль не передаётся постоянно), поддержка сессий, возможность тонкой настройки прав (scopes) и удобство для распределённых систем (микросервисов).
Ответ 18+ 🔞
А, токены, блядь! Ну, слушай, сейчас разжуем эту хуйню так, что даже бабушка твоя поймёт, если, конечно, не обосрётся от терминов.
Вот представь: пароль — это как ключ от квартиры. Ты его всем показываешь, каждый раз в замке ковыряешь — рано или поздно спиздят или слепок снимут, пиздец. А токен — это как одноразовый пропуск, который тебе выдают на проходной после того, как ты паспорт показал. Погулял часок — и в мусорку. Нахуй он больше никому не нужен.
Основные разновидности этой хуеты:
- Access Token (Токен доступа): Это тот самый одноразовый пропуск, короткий такой. Прижал его ко лбу и бежишь к API: «Эй, сука, дай мне список котиков!». Сервер глянул, проверил печать — и выдал тебе котиков. Кончился срок — иди нахуй, получай новый.
- Refresh Token (Токен обновления): А это уже не пропуск, а, блядь, справка, что ты свой мужик. Лежит себе тихо в сейфе (в тех самых HTTP-Only куках), никто его не трогает. Как только Access Token сдох, ты тычешь эту справку и тебе выдают новый пропуск, даже пароль вводить не надо. Удобно, ёпта!
- JWT (JSON Web Token): Самый, блядь, модный формат этих пропусков. Внутри него уже зашито, кто ты такой и когда подохнешь. Весь самодостаточный, как ёбнутый чебурек. Распаковал — и всё про тебя знают.
Вот, смотри, как эту муть на Python поколбасить (библиотека PyJWT):
import jwt
import datetime
# Секретный ключ, который должен знать только сервер. Высрал его в публичный репозиторий — пидарас.
SECRET_KEY = "your-256-bit-secret"
# Штампуем новый пропуск (токен)
payload = {
"user_id": 12345,
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) # Жить ему один час, не больше.
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(f"Access Token: {token}")
# А вот сервер проверяет, не просроченный ли ты подсунул
try:
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
print(f"Данные пользователя: {decoded_payload}")
except jwt.ExpiredSignatureError:
print("Ошибка: Срок действия токена истек.") # Твой пропуск сгнил, дружок.
except jwt.InvalidTokenError:
print("Ошибка: Неверный токен.") # Поддельная хуйня, даже не пытайся.
А вот как этим в автотестах пользоваться, чтобы не выглядеть конченым дауном:
import requests
# Сначала выпрашиваем пропуск у системы (логинимся)
auth_response = requests.post("https://api.example.com/login", json={"login": "user", "pass": "123"})
access_token = auth_response.json()["access_token"] # Вот он, святой грааль!
# И теперь с этим граалем лезем в защищённое API, как будто так и надо
headers = {
"Authorization": f"Bearer {access_token}" # Слово «Bearer» — это магическое заклинание, его тоже надо говорить.
}
api_response = requests.get("https://api.example.com/protected/data", headers=headers)
print(api_response.json())
И в чём, собственно, кайф? Да в том, что пароль по сети не болтается, как сопля на ветру. Сессии управлять удобно, права поскопить можно. Для этих ваших микросервисов — вообще красота, один токен по всем задроцким контурам побежал. В общем, не пароль, а мечта, ебать её в сраку.