Uwierzytelnianie: klucze API i OAuth
Tokeny Bearer, nagłówki z kluczami API i przepływy OAuth2 umożliwiające dostęp agentów do API.
Uwierzytelnianie: klucze API i OAuth to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Dlaczego uwierzytelnianie ma znaczenie dla agentów
Gdy agent wywołuje zewnętrzne API, serwer musi wiedzieć, kto wysyła żądanie. Uwierzytelnianie potwierdza tożsamość, a autoryzacja określa, jakie działania można wykonać. Bez prawidłowego uwierzytelniania każde żądanie zwraca 401 Unauthorized, a agent nie może nic zrobić.
W tworzeniu agentów dominują dwa wzorce: klucze API i 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) # 200Klucz API w nagłówku Authorization
Najczęściej klucz API wysyła się w nagłówku Authorization jako token Bearer. Słowo „Bearer” oznacza, że osoba posiadająca ten token jest upoważniona — serwer ufa posiadaczowi klucza.
Ten sposób jest stosowany przez OpenAI, Anthropic, GitHub i większość nowoczesnych interfejsów 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'])Klucz API w niestandardowym nagłówku (X-API-Key)
Niektóre interfejsy API — zwłaszcza starsze lub wewnętrzne — używają niestandardowego nagłówka, takiego jak X-API-Key, zamiast Authorization: Bearer. Wzorzec jest taki sam, zmienia się tylko nazwa nagłówka. Zawsze należy sprawdzić w dokumentacji API dokładną oczekiwaną nazwę nagłówka.
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')Przechowywanie danych uwierzytelniających w zmiennych środowiskowych
Nigdy nie należy umieszczać kluczy API na stałe w kodzie źródłowym. Jeśli klucz trafi do publicznego repozytorium, boty znajdą go i wykorzystają w ciągu kilku sekund. Prawidłowy wzorzec polega na przechowywaniu danych uwierzytelniających w zmiennych środowiskowych i odczytywaniu ich w czasie działania za pomocą os.environ.
Należy używać os.environ.get() i wyświetlać jednoznaczny komunikat błędu, jeśli brakuje klucza.
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)')Używanie python-dotenv podczas programowania lokalnego
Podczas programowania klucze należy przechowywać w pliku .env w katalogu głównym projektu. Biblioteka python-dotenv pozwala ładować je automatycznie. Dodaj .env do pliku .gitignore, aby nigdy nie został zatwierdzony w repozytorium.
# .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')Czym jest OAuth 2.0?
OAuth 2.0 to standard delegowanej autoryzacji. Zamiast przekazywać agentowi hasło użytkownika, OAuth pozwala użytkownikowi upoważnić agenta do działania w jego imieniu, z ograniczonym zakresem uprawnień i czasem ważności. Z rozwiązania tego korzystają Google, GitHub, Slack i Salesforce.
Najważniejsza koncepcja jest następująca: po zakończeniu procesu autoryzacji agent otrzymuje token dostępu, a następnie używa go do wywoływania 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')Przepływ danych uwierzytelniających klienta OAuth2
Przepływ danych uwierzytelniających klienta to najprostszy przepływ OAuth dla agentów — nie wymaga interakcji z użytkownikiem. Agent uwierzytelnia się za pomocą własnego identyfikatora klienta i sekretu, aby uzyskać token. Stosuje się go do komunikacji maszyna–maszyna (M2M).
Identyfikator i sekret należy wysłać metodą POST do punktu końcowego tokenu, a w odpowiedzi otrzymuje się krótkotrwały token dostępu.
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')Używanie tokenów OAuth w wywołaniach API
Po uzyskaniu tokenu dostępu OAuth należy używać go dokładnie tak jak klucza API — w nagłówku Authorization: Bearer. Różnica polega na tym, że tokeny OAuth wygasają, dlatego przed wykonywaniem wywołań agent musi obsłużyć odświeżanie tokenu.
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 z biblioteką google-auth
W przypadku interfejsów API Google biblioteka google-auth zajmuje się całą złożonością OAuth. Automatycznie odświeża token, odczytuje dane uwierzytelniające z pliku JSON i dołącza tokeny do żądań za pośrednictwem obiektu 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())Najlepsze praktyki dotyczące bezpieczeństwa kluczy API
Ochrona kluczy API ma kluczowe znaczenie dla bezpieczeństwa agentów. Należy przestrzegać następujących zasad:
- Klucze należy przechowywać w zmiennych środowiskowych lub menedżerze sekretów (AWS Secrets Manager, HashiCorp Vault)
- Nigdy nie należy rejestrować kluczy w logach — w danych wyjściowych trzeba je maskować
- Klucze należy regularnie rotować, a te, które zostały ujawnione, natychmiast unieważniać
- Należy stosować zasadę najmniejszych uprawnień — żądać tylko zakresów, których potrzebuje agent
- Należy ustawić listy dozwolonych adresów IP dla kluczy API, jeśli dostawca to obsługuje
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)}')Obsługa 401 Unauthorized w agencie
Gdy agent otrzyma odpowiedź 401 Unauthorized, nigdy nie powinien bezmyślnie ponawiać żądania — spowoduje to niepotrzebne zużycie limitu żądań. Należy sprawdzić, czy token wygasł (i spróbować go odświeżyć), czy sam klucz jest nieprawidłowy (w takim przypadku trzeba natychmiast wysłać alert, aby człowiek mógł to naprawić).
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()Szybkie sprawdzenie: przechowywanie klucza API
Sprawdzenie zrozumienia zarządzania poświadczeniami.
Podsumowanie uwierzytelniania
Poznali Państwo dwa główne wzorce uwierzytelniania agentów:
- Klucze API — przekazywane w nagłówku
Authorization: Bearer TOKENlubX-API-Key; proste i bezstanowe - OAuth 2.0 — przepływ danych uwierzytelniających klienta dla M2M; tokeny wygasają i trzeba je odświeżać
- Klucze należy zawsze przechowywać w zmiennych środowiskowych, nigdy w kodzie źródłowym
- Lokalnie należy używać python-dotenv; w produkcji — zmiennych środowiskowych lub menedżerów sekretów
- Odpowiedzi 401 należy obsługiwać, sprawdzając, czy token wygasł, czy klucz jest nieprawidłowy
Solidna obsługa uwierzytelniania stanowi fundament każdego niezawodnego agenta.
Często zadawane pytania
Czy lekcja „Uwierzytelnianie: klucze API i OAuth” jest bezpłatna?
Tak — pełny tekst „Uwierzytelnianie: klucze API i OAuth” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Uwierzytelnianie: klucze API i OAuth”?
Tokeny Bearer, nagłówki z kluczami API i przepływy OAuth2 umożliwiające dostęp agentów do API. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Uwierzytelnianie: klucze API i OAuth”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy REST API dla twórców agentów
- Uwierzytelnianie: klucze API i OAuth
- Obsługa odpowiedzi i błędów API
- Ograniczanie liczby żądań i logika ponawiania