Аутентификация: ключи API и OAuth
Токены Bearer, заголовки с ключами API и потоки OAuth2 для доступа агентов к API.
«Аутентификация: ключи API и OAuth» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Почему аутентификация важна для агентов
Когда ваш агент обращается к внешнему API, серверу нужно знать, кто выполняет запрос. Аутентификация подтверждает личность, а авторизация определяет, что разрешено делать. Без правильной аутентификации каждый запрос возвращает 401 Unauthorized, и ваш агент не может ничего сделать.
В разработке агентов преобладают два подхода: ключи API и OAuth 2.0.
import requests
# Without auth — will get 401
response = requests.get('https://api.openai.com/v1/models')
print(response.status_code) # 401 Unauthorized
# With API key in header — works
headers = {'Authorization': 'Bearer sk-proj-abc123'}
response = requests.get(
'https://api.openai.com/v1/models',
headers=headers
)
print(response.status_code) # 200Ключ API в заголовке Authorization
Самый распространённый подход — отправлять ключ API в заголовке Authorization в виде токена Bearer. Слово «Bearer» означает, что тот, у кого есть этот токен, авторизован: сервер доверяет предъявителю ключа.
Этот подход используют OpenAI, Anthropic, GitHub и большинство современных API.
import requests
import os
api_key = os.environ['OPENAI_API_KEY']
response = requests.post(
'https://api.openai.com/v1/chat/completions',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json={
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': 'Hello!'}]
}
)
print(response.json()['choices'][0]['message']['content'])Ключ API в пользовательском заголовке X-API-Key
Некоторые API, особенно старые или внутренние, вместо Authorization: Bearer используют пользовательский заголовок вроде X-API-Key. Принцип тот же, меняется только имя заголовка. Всегда сверяйтесь с документацией API, чтобы узнать точное ожидаемое имя заголовка.
import requests
import os
api_key = os.environ['SERVICE_API_KEY']
response = requests.get(
'https://api.someservice.com/v1/data',
headers={
'X-API-Key': api_key,
'Accept': 'application/json'
}
)
if response.status_code == 200:
data = response.json()
print('Got data:', data)
elif response.status_code == 401:
print('Invalid API key — check X-API-Key header')Хранение учётных данных в переменных окружения
Никогда не записывайте ключи API непосредственно в исходный код. Если вы добавите ключ в общедоступный репозиторий, боты найдут его и начнут злоупотреблять им в течение нескольких секунд. Правильный подход — хранить учётные данные в переменных окружения и считывать их во время выполнения с помощью os.environ.
Используйте os.environ.get() с понятным сообщением об ошибке, если ключ отсутствует.
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789' # simulate a set env var
api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
raise EnvironmentError(
'OPENAI_API_KEY environment variable not set. '
'Run: export OPENAI_API_KEY=your-key-here'
)
print('API key loaded from environment (never hard-code it in source)')Использование python-dotenv при локальной разработке
Во время разработки храните ключи в файле .env в корневом каталоге проекта. Используйте библиотеку python-dotenv, чтобы загружать их автоматически. Добавьте .env в файл .gitignore, чтобы этот файл никогда не был добавлен в репозиторий.
# .env file (never commit this!)
# OPENAI_API_KEY=sk-proj-abc123
# ANTHROPIC_API_KEY=sk-ant-xyz456
# GITHUB_TOKEN=ghp_abc789
# In your Python code:
from dotenv import load_dotenv
import os
load_dotenv() # loads .env into os.environ
openai_key = os.environ['OPENAI_API_KEY']
anthropic_key = os.environ['ANTHROPIC_API_KEY']
github_token = os.environ['GITHUB_TOKEN']
print('Keys loaded successfully')Что такое OAuth 2.0
OAuth 2.0 — это стандарт делегированной авторизации. Вместо того чтобы передавать агенту пароль пользователя, OAuth позволяет пользователю разрешить агенту действовать от его имени с ограниченным набором разрешений и в течение ограниченного периода времени. Этот стандарт используют Google, GitHub, Slack и Salesforce.
Ключевая концепция: после процесса авторизации агент получает токен доступа, а затем использует этот токен для вызовов API.
# OAuth flow overview:
#
# 1. Agent redirects user to:
# https://auth.provider.com/oauth/authorize
# ?client_id=YOUR_CLIENT_ID
# &redirect_uri=http://localhost:8080/callback
# &scope=read:repo%20write:issues
# &response_type=code
#
# 2. User logs in and grants permission
# 3. Provider redirects to your callback with ?code=AUTH_CODE
# 4. Agent exchanges code for access_token
# 5. Agent uses access_token for API calls
print('OAuth flow: authorize -> code -> token -> API calls')Поток учётных данных клиента OAuth2
Поток учётных данных клиента — самый простой поток OAuth для агентов: взаимодействие с пользователем не требуется. Агент проходит аутентификацию с помощью собственного идентификатора и секрета клиента, чтобы получить токен. Этот поток используется для межмашинного взаимодействия.
Вы отправляете свои учётные данные методом POST на конечную точку токенов и получаете краткосрочный токен доступа.
import requests
import os
client_id = os.environ['OAUTH_CLIENT_ID']
client_secret = os.environ['OAUTH_CLIENT_SECRET']
token_url = 'https://auth.example.com/oauth/token'
# Request an access token
response = requests.post(token_url, data={
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'read:data write:tasks'
})
token_data = response.json()
access_token = token_data['access_token']
expires_in = token_data['expires_in'] # seconds
print(f'Token valid for {expires_in}s')Использование токенов OAuth в вызовах API
Получив токен доступа OAuth, используйте его так же, как ключ API, — в заголовке Authorization: Bearer. Разница в том, что срок действия токенов OAuth истекает, поэтому перед вызовами агент должен обновлять токен.
import requests
import os
import time
class OAuthClient:
def __init__(self, client_id, client_secret, token_url):
self.client_id = client_id
self.client_secret = client_secret
self.token_url = token_url
self.access_token = None
self.token_expiry = 0
def get_token(self):
if time.time() < self.token_expiry - 60: # 60s buffer
return self.access_token
r = requests.post(self.token_url, data={
'grant_type': 'client_credentials',
'client_id': self.client_id,
'client_secret': self.client_secret
})
data = r.json()
self.access_token = data['access_token']
self.token_expiry = time.time() + data['expires_in']
return self.access_token
def get(self, url):
token = self.get_token()
return requests.get(url, headers={'Authorization': f'Bearer {token}'})OAuth 2.0 с библиотекой аутентификации Google
Для API Google библиотека аутентификации Google берёт на себя всю сложность OAuth. Она автоматически обновляет токены, считывает учётные данные из JSON-файла и добавляет токены к запросам через AuthorizedSession.
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
# Load service account credentials from JSON file
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=[
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
)
# AuthorizedSession auto-refreshes tokens
session = AuthorizedSession(credentials)
response = session.get(
'https://www.googleapis.com/gmail/v1/users/me/messages'
)
print(response.json())Рекомендации по безопасности ключей API
Защита ключей API критически важна для безопасности агента. Соблюдайте следующие правила:
- Храните ключи в переменных окружения или в менеджере секретов (AWS Secrets Manager, HashiCorp Vault)
- Никогда не записывайте ключи в журналы — маскируйте их в выводе
- Регулярно меняйте ключи и немедленно отзывайте скомпрометированные
- Используйте принцип наименьших привилегий — запрашивайте только те области доступа, которые нужны агенту
- Настраивайте списки разрешённых IP-адресов для ключей API, если поставщик поддерживает такую возможность
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'
def get_key(env_var):
key = os.environ.get(env_var)
if not key:
raise EnvironmentError(f'Missing required env var: {env_var}')
return key
def mask_key(key):
if len(key) < 8:
return '***'
return key[:4] + '...' + key[-4:]
api_key = get_key('OPENAI_API_KEY')
print(f'Using key: {mask_key(api_key)}')Обработка ошибки 401 «Не авторизовано» в агенте
Получив ответ 401 Unauthorized, агент не должен бездумно повторять запрос: это расходует квоту ограничений частоты. Вместо этого проверьте, не истёк ли токен (попробуйте обновить его) или недействителен ли сам ключ (немедленно сообщите об этом, чтобы человек мог исправить проблему).
import requests
import os
def call_api_with_auth_check(url, api_key):
response = requests.get(
url,
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 401:
error = response.json().get('error', {})
code = error.get('code', 'unknown')
if code == 'token_expired':
print('Token expired — refresh needed')
# trigger token refresh flow
else:
raise PermissionError(
f'API key rejected: {error.get("message", "401 Unauthorized")}'
)
response.raise_for_status()
return response.json()Быстрая проверка: хранение ключей API
Проверьте, насколько хорошо Вы понимаете управление учётными данными.
Итоги аутентификации
Вы изучили два основных способа аутентификации агентов:
- Ключи API — передаются в заголовке
Authorization: Bearer TOKENилиX-API-Key; это простой способ без сохранения состояния - OAuth 2.0 — поток учётных данных клиента для межмашинного взаимодействия; срок действия токенов истекает, поэтому их нужно обновлять
- Всегда храните ключи в переменных окружения, а не в исходном коде
- Локально используйте библиотеку для загрузки переменных окружения, а в рабочей среде — переменные окружения или менеджеры секретов
- Обрабатывайте ответы 401, проверяя, истёк ли токен или недействителен ключ
Надёжная обработка аутентификации — основа любого надёжного агента.
Часто задаваемые вопросы
Урок «Аутентификация: ключи API и OAuth» бесплатный?
Да — полный текст урока «Аутентификация: ключи API и OAuth» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Аутентификация: ключи API и OAuth»?
Токены Bearer, заголовки с ключами API и потоки OAuth2 для доступа агентов к API. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Аутентификация: ключи API и OAuth»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы REST API для разработчиков агентов
- Аутентификация: ключи API и OAuth
- Обработка ответов API и ошибок
- Ограничение частоты запросов и логика повторных попыток