基礎から学ぶPython入門 90日コース | Web・API - Day 49:POSTと認証

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

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サーバー

と組み合わせて、 「データを送る」「認証する」「レスポンスを安全に扱う」という流れを、 より実践的な形で育てていくことができます。

タイトルとURLをコピーしました