0Pricing
AI Agents · Урок

Аутентификация: ключи 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы REST API для разработчиков агентов
  2. Аутентификация: ключи API и OAuth
  3. Обработка ответов API и ошибок
  4. Ограничение частоты запросов и логика повторных попыток
← Назад к AI Agents