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)