Python · API · Средний уровень

Token-авторизация

5 задач

Зарегистрируйте пользователя, получите токен авторизации и выполняйте авторизованные запросы к API.

Процесс Token-авторизации

#
Некоторые эндпоинты API требуют аутентификации — вы должны доказать, кто вы, прежде чем сервер вернёт данные. Наиболее распространённой лёгкой схемой является токен-авторизация. Процесс состоит из трёх шагов: 1. Регистрация — создайте учётную запись, отправив POST с логином и паролем. 2. Получение токена — обменяйте свои учётные данные на строку-токен. 3. Отправка токена — включайте его в заголовок Authorization в каждом аутентифицированном запросе. Без заголовка сервер возвращает 401 Unauthorized. С ним сервер знает, кто вы и что вам разрешено делать. Формат заголовка для токен-авторизации: ``` Authorization: Token <ваша-строка-токена> ``` В requests: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' token = 'abc123...' headers = {'Authorization': f'Token {token}'} response = requests.get(f'{BASE_URL}/api/users/profile/', headers=headers) ``` Токен идентифицирует вас — он является секретом, так же как пароль. Никогда не выводите его в публичные логи и не храните в системе контроля версий. В скриптах храните его в переменной и передавайте через заголовки. Важно: на apilearn.tukas.dev база данных сбрасывается ежедневно в полночь UTC. Пользователи и токены, созданные сегодня, не будут существовать завтра. Всегда регистрируйтесь и получайте свежий токен в начале сессии.

Регистрация, токен и авторизованные запросы

#
Шаг 1 — зарегистрируйте нового пользователя: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' register_data = { 'username': 'alice42', 'password': 'securepass123', 'email': '[email protected]', # необязательно } response = requests.post(f'{BASE_URL}/api/users/register/', json=register_data) print(response.status_code) # 201 Created print(response.json()) # Ответ 201 также содержит поле 'token' — можно использовать его сразу # и пропустить отдельный запрос к /api/auth/token/, если только что зарегистрировались. ``` Шаг 2 — получите токен с этими учётными данными: ```python token_data = {'username': 'alice42', 'password': 'securepass123'} response = requests.post(f'{BASE_URL}/api/auth/token/', json=token_data) token = response.json()['token'] print(token) # длинная буквенно-цифровая строка ``` Шаг 3 — используйте токен для доступа к защищённым эндпоинтам: ```python headers = {'Authorization': f'Token {token}'} # Посмотреть профиль profile = requests.get(f'{BASE_URL}/api/users/profile/', headers=headers).json() print(profile['username']) # 'alice42' # Посмотреть корзину cart = requests.get(f'{BASE_URL}/api/cart/', headers=headers).json() print(cart) ``` Использование requests.Session() позволяет установить заголовок один раз и повторно использовать его во всех запросах: ```python session = requests.Session() session.headers['Authorization'] = f'Token {token}' # headers= не нужен в отдельных вызовах profile = session.get(f'{BASE_URL}/api/users/profile/').json() cart = session.get(f'{BASE_URL}/api/cart/').json() print(profile['username']) print(cart) ``` Session особенно полезен, когда нужно сделать много аутентифицированных вызовов подряд — вы определяете заголовок один раз и больше о нём не думаете.

Справочник Token-авторизации

#
Эндпоинты авторизации: ``` POST /api/users/register/ Создать нового пользователя тело: {username, password, email (необязательно)} успех: 201, возвращает объект пользователя + поле token POST /api/auth/token/ Получить токен для существующего пользователя тело: {username, password} успех: 200, возвращает {token: '...'} DELETE /api/auth/token/ Отозвать текущий токен (требуется авторизация) ``` Защищённые эндпоинты (нужен заголовок Authorization): ``` GET/PUT/PATCH /api/users/profile/ GET /api/cart/ POST /api/cart/items/ GET /api/orders/ POST /api/orders/ ``` Заголовок Authorization: ``` Authorization: Token <строка-токена> ``` Паттерн для отдельного запроса: ```python headers = {'Authorization': f'Token {token}'} requests.get(url, headers=headers) ``` Паттерн с Session: ```python session = requests.Session() session.headers['Authorization'] = f'Token {token}' session.get(url1) session.get(url2) ```
01

Зарегистрировать нового пользователя

#

Зарегистрируйте нового пользователя, отправив POST к /api/users/register/ с логином и паролем. Выведите код статуса и JSON ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

data = {
    'username': 'testuser01',
    'password': 'mypassword123',
}

# Зарегистрируйтесь и выведите код статуса + ответ
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

data = {
    'username': 'testuser01',
    'password': 'mypassword123',
}
response = requests.post(f'{BASE_URL}/api/users/register/', json=data)
print(response.status_code)
print(response.json())
02

Получить токен авторизации

#

Выполните POST к /api/auth/token/ с логином и паролем и выведите строку токена из ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

credentials = {
    'username': 'testuser01',
    'password': 'mypassword123',
}

# Получите токен и выведите его
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

credentials = {
    'username': 'testuser01',
    'password': 'mypassword123',
}
response = requests.post(f'{BASE_URL}/api/auth/token/', json=credentials)
token = response.json()['token']
print(token)
03

Доступ к защищённому эндпоинту

#

Используя полученный токен, отправьте GET к /api/users/profile/ с заголовком Authorization. Выведите логин из ответа профиля.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = 'ВСТАВЬТЕ_ВАШ_ТОКЕН_ЗДЕСЬ'

# GET профиля с заголовком Authorization и вывод логина
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = 'ВСТАВЬТЕ_ВАШ_ТОКЕН_ЗДЕСЬ'

headers = {'Authorization': f'Token {token}'}
response = requests.get(f'{BASE_URL}/api/users/profile/', headers=headers)
print(response.json()['username'])
04

Что будет без авторизации

#

Попробуйте выполнить GET /api/cart/ без заголовка Authorization. Выведите код статуса и сообщение об ошибке из ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# GET /api/cart/ без заголовка авторизации
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/cart/')
print(response.status_code)
print(response.json())
05

Session для нескольких вызовов

#

Зарегистрируйте пользователя, получите токен, затем используйте requests.Session() для двух аутентифицированных вызовов — GET /api/users/profile/ и GET /api/cart/ — без указания заголовка Authorization в каждом вызове. Выведите логин из профиля и ответ корзины.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Регистрация
# 2. Получение токена
# 3. Создание Session с заголовком авторизации
# 4. Два вызова через Session
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Регистрация
reg = requests.post(f'{BASE_URL}/api/users/register/', json={
    'username': 'sessionuser01', 'password': 'securepass123',
})

# Получение токена
token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'sessionuser01', 'password': 'securepass123',
}).json()['token']

# Session
session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

profile = session.get(f'{BASE_URL}/api/users/profile/').json()
cart = session.get(f'{BASE_URL}/api/cart/').json()

print(profile['username'])
print(cart)