0Pricing
AI Agents · レッスン

認証: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)  # 200

Authorizationヘッダー内の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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エージェント開発者のためのREST API基礎
  2. 認証:API KeysとOAuth
  3. APIレスポンスとエラーの処理
  4. レート制限とリトライロジック
← AI Agentsに戻る