認証:API KeysとOAuth
エージェントからAPIへアクセスするためのBearerトークン、API keyヘッダー、OAuth2フローを学びます。
「認証:API KeysとOAuth」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
エージェントに認証が重要な理由
エージェントが外部APIを呼び出すとき、サーバーはリクエストを送っているのが誰なのかを知る必要があります。認証は身元を証明し、認可は何を実行できるかを決定します。適切な認証がなければ、すべてのリクエストが401 Unauthorizedを返し、エージェントは何も実行できません。
エージェント開発では、APIキーとOAuth 2.0という2つのパターンが主流です。
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) # 200Authorizationヘッダー内のAPIキー
最も一般的なパターンは、APIキーをBearerトークンとしてAuthorizationヘッダーに入れて送信する方法です。「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'])カスタムヘッダー(X-API-Key)内のAPIキー
一部のAPI、特に古いAPIや内部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フローです。ユーザーの操作は必要ありません。エージェント自身のクライアントIDとシークレットで認証し、トークンを取得します。これはマシン間(M2M)通信に使用されます。
トークンエンドポイントに認証情報を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}'})google-authライブラリでOAuth 2.0を使用する
Google APIでは、google-authライブラリが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)に保存する
- キーをログに記録しない。出力ではマスクする
- キーを定期的にローテーションし、漏えいしたキーは直ちに失効させる
- 最小権限の原則を使用し、エージェントに必要なスコープだけを要求する
- プロバイダーがサポートしている場合は、APIキーにIP許可リストを設定する
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 Unauthorizedの処理
エージェントが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キーの保存
認証情報の管理について理解度を確認します。
認証のまとめ
エージェントにおける、主な2つの認証パターンを学びました。
- APIキー —
Authorization: Bearer TOKENまたはX-API-Keyヘッダーで渡す。シンプルでステートレス - OAuth 2.0 — M2M向けのクライアントクレデンシャルフロー。トークンには有効期限があり、更新が必要
- キーは常に環境変数に保存し、ソースコードには決して記述しない
- ローカルではpython-dotenvを使用し、本番環境では環境変数またはシークレットマネージャーを使用する
- 401レスポンスを受け取ったら、トークンの期限切れかキーの無効化かを確認する
堅牢な認証処理は、信頼できるすべてのエージェントの基盤です。
よくある質問
「認証:API KeysとOAuth」レッスンは無料ですか?
はい。「認証:API KeysとOAuth」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「認証:API KeysとOAuth」で何を学びますか?
エージェントからAPIへアクセスするためのBearerトークン、API keyヘッダー、OAuth2フローを学びます。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「認証:API KeysとOAuth」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- エージェント開発者のためのREST API基礎
- 認証:API KeysとOAuth
- APIレスポンスとエラーの処理
- レート制限とリトライロジック