Day 49:POSTと認証 ― 「送る」と「守る」をセットで考える
Day 49では、APIにデータを 送る ときに使う POST と、 APIを安全に使うための 認証(APIキー・Bearer Token) をセットで学んでいきます。
テーマは次の4つです。
- POST
- JSON送信
- APIキー
- Bearer Token
「送る」と「守る」は、APIを扱ううえで必ずセットになる考え方です。 ひとつずつ、落ち着いて見ていきましょう。
POSTとは:サーバーに「データを渡して処理してもらう」リクエスト
GETとの違いをイメージでつかむ
まずは、POST のイメージから。
- GET:
- 「この情報をください」
- 例:ニュース一覧を取得、天気情報を取得
- POST:
- 「このデータを送るから、登録して・処理して」
- 例:新規ユーザー登録、フォーム送信、注文データの送信
つまり、POSTは 「何かをサーバーに渡す」 ときに使うメソッドです。
JSON送信:Pythonから「データの箱」を渡す
POSTでJSONを送る基本パターン
APIにデータを送るとき、 その中身はほとんどの場合 JSON で表現されます。
Pythonの requests では、 json= 引数を使うことで、辞書をそのままJSONとして送ることができます。
# day49_post_json_basic.py
import requests # HTTP通信を簡単にしてくれるライブラリです。
def post_json_example():
"""JSONデータをPOSTで送る基本例です。"""
# 練習用のAPI(httpbin)は、送った内容をそのまま返してくれるサービスです。
url = "https://httpbin.org/post"
# サーバーに送りたいデータを辞書で用意します。
payload = {
"username": "taro",
"score": 95,
"tags": ["beginner", "python"]
}
# POSTリクエストを送ります。
# json= に辞書を渡すと、JSON形式に変換して送ってくれます。
response = requests.post(url, json=payload)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
post_json_example()
Pythonポイント:
json=payloadを使うと、Content-Type: application/jsonを自動で付けてくれます。- 辞書をそのまま渡せるので、手動で
json.dumps()する必要がありません。
認証の基本:APIキーとBearer Tokenの役割
なぜ認証が必要なのか
APIは「サービスの窓口」なので、 誰でも好き勝手に叩けると、次のような問題が起こります。
- 不正アクセス
- 過剰なリクエスト(サービスの負荷)
- 有料サービスのタダ乗り
そこで登場するのが 認証 です。
「このリクエストは、ちゃんと許可された人から来ているか?」
を確認するための仕組みですね。
代表的なものが APIキー と Bearer Token です。
APIキー:サービスが発行する「合言葉」
APIキーのイメージ
APIキー は、サービス側がユーザーごとに発行する「合言葉」のようなものです。
- サービスに登録すると、長い文字列のキーが発行される
- そのキーをリクエストに含めることで、「この人は登録済みユーザーです」と証明する
という使い方をします。
APIキーをヘッダーで送る例
多くのサービスでは、APIキーを HTTPヘッダー に載せて送ります。
# day49_api_key_example.py
import requests
def get_with_api_key():
"""APIキーを使って認証する例です(ダミーキーを使用)。"""
url = "https://httpbin.org/get"
# 実際のサービスでは、ここに本物のAPIキーを設定します。
# 例: api_key = "sk-xxxxxxxxxxxxxxxx"
api_key = "DUMMY_API_KEY_123456"
# ヘッダーにAPIキーを載せます。
headers = {
"X-API-Key": api_key # サービスごとにヘッダー名は異なります。
}
response = requests.get(url, headers=headers)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_with_api_key()
Python注意点:
- 実際のAPIキーは 絶対にコードにベタ書きしない のが基本です。
- 環境変数や設定ファイルなどで管理するのが安全です。
- GitHubなどに公開するときは、APIキーが含まれていないか必ず確認します。
Bearer Token:より高度な「認可トークン」
Bearer Tokenのイメージ
Bearer Token は、 「このトークンを持っている人は、特定の権限を持っている」と示すための文字列です。
- ログインや認証の結果として発行される
- 有効期限があることが多い
- 権限(読み取り専用・書き込み可など)が紐づいていることもある
APIキーが「固定の合言葉」だとすると、 Bearer Tokenは「期限付きの通行証」のようなイメージです。
Bearer TokenをAuthorizationヘッダーで送る例
Bearer Tokenは、Authorization ヘッダーに載せて送るのが一般的です。
# day49_bearer_token_example.py
import requests
def get_with_bearer_token():
"""Bearer Tokenを使って認証する例です(ダミートークンを使用)。"""
url = "https://httpbin.org/get"
# 実際のサービスでは、認証処理の結果としてトークンが発行されます。
bearer_token = "DUMMY_BEARER_TOKEN_ABCDEF"
# Authorizationヘッダーに "Bearer <token>" の形式で載せます。
headers = {
"Authorization": f"Bearer {bearer_token}"
}
response = requests.get(url, headers=headers)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_with_bearer_token()
Pythonポイント:
Authorization: Bearer <token>という形式がほぼ標準です。- 実際のトークンは、APIキーと同様に安全に管理する必要があります。
POST+認証+JSON送信をまとめた「安全なAPIクライアント」
ここまでの要素をまとめて、 POSTでJSONを送りつつ、Bearer Tokenで認証する 小さなクライアントを作ってみます。
# day49_secure_post_client.py
import requests
def post_with_auth(
url: str,
payload: dict,
bearer_token: str,
):
"""
認証付きでJSONをPOSTするAPIクライアント関数です。
- URLにPOSTでアクセスします。
- JSONデータを送信します。
- Bearer Tokenで認証します。
"""
print(f"[POST] {url} にデータを送信します。")
print("送信データ:", payload)
# AuthorizationヘッダーにBearer Tokenを載せます。
headers = {
"Authorization": f"Bearer {bearer_token}",
"Content-Type": "application/json", # JSONを送ることを明示します。
}
# POSTリクエストを送ります。
response = requests.post(url, json=payload, headers=headers)
print("ステータスコード:", response.status_code)
# 成功(200番台)のときだけレスポンスをJSONとして扱います。
if 200 <= response.status_code < 300:
try:
data = response.json()
print("レスポンスJSON:")
print(data)
return data
except ValueError:
print("JSONとして解釈できませんでした。レスポンス本文:")
print(response.text)
return None
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
return None
def main():
# 練習用のURL(httpbin)は、送った内容をそのまま返してくれます。
url = "https://httpbin.org/post"
# 送信するJSONデータです。
payload = {
"message": "Hello API",
"value": 123
}
# ダミーのBearer Tokenです(実際のサービスでは本物を使います)。
bearer_token = "DUMMY_BEARER_TOKEN_ABCDEF"
post_with_auth(url, payload, bearer_token)
if __name__ == "__main__":
main()
Pythonこのクライアントは、
- JSONデータをPOSTで送る
- Bearer Tokenで認証する
- ステータスコードをチェックして、成功時だけJSONレスポンスを扱う
という、実務に近い形になっています。
Day 49のまとめ
Day 49では、POSTと認証について、
- POSTは「このデータを送るから、登録して・処理して」というリクエストであること
- JSON送信は、
json=引数を使うことで辞書をそのままAPIに渡せること - APIキーは、サービスがユーザーごとに発行する「合言葉」のような認証情報であること
- Bearer Tokenは、認証の結果として発行される「期限付きの通行証」のようなトークンであること
- Authorizationヘッダーに
Bearer <token>を載せることで、APIに対して認証付きリクエストを送れること - POST+認証+JSON送信を組み合わせた「安全なAPIクライアント」を作れること
を、コード例とともに整理しました。
ここから先は、
- 実際の外部サービス(翻訳API、決済API、チャットAPIなど)
- 社内の認証付きAPI
- 自分で作る認証付きAPIサーバー
と組み合わせて、 「データを送る」「認証する」「レスポンスを安全に扱う」という流れを、 より実践的な形で育てていくことができます。
