「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 有効な JWT クレーム セットの構築

有効な JWT クレーム セットの構築

2024 年 11 月 4 日に公開
ブラウズ:663

Building a valid JWT Claims Set

イントロ

サンプルで報告された問題を修正するプル リクエストをレビューする必要があり、テストが合格している間に、サンプルで変更が必要な何かがさらに起こっているに違いないと感じました。

JSON Web Token (JWT は「ジョッツ」と発音します) については少し前から知っていましたが、知りません。このPRを見て、もっと掘り下げてみたいと思うきっかけができました。

JWTとは

JWT は、当事者間で情報を安全に送信するためのオープン標準の方法です。これらは、ユーザーを認証し、リソースへのアクセスを承認するためによく使用されます。これらは、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。

JWT が必要な理由

IAM サービス アカウント認証情報 API は、IAM サービス アカウントになりすますための有効期間の短い認証情報を作成します。 SignJwtメソッドは、サービスアカウントのシステム管理の秘密キーを使用してJWTに署名します。 SignJwt メソッドのリクエスト本文内のペイロード フィールドには、JWT クレーム セットを含むシリアル化された JSON オブジェクトが含まれている必要があります。

JWT クレームとは

クレームは、JWT が送信するコア情報です。

有効なクレーム セットの例を次に示します:

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceAccounts/[email protected]",
  "aud": "https://my-iap-protected-app.example.com",
  "iat": 1694003600,
  "exp": 1694007200
}

このクレーム セットには次のフィールドが含まれます:

  • iss: JWT の発行者、認証するサービス アカウント、この場合はサービス アカウントの電子メールである必要があります。
  • sub: JWT のユーザーの件名 (サービス アカウントの電子メール)。
  • aud: JWT の対象者。IAP で保護されたリソースの URL です。
  • iat: 発行時刻。JWT が生成された時刻です。これは UTC の整数である必要があります。
  • exp: 有効期限。JWT が有効でなくなる時刻です。 Cloud IAM には追加の制限事項が記載されています。それは、過去および 12 時間以内の将来であることはできません。

これらのクレームを JWT のペイロードに含めることで、それが有効であり、IAP で保護されたリソースへのアクセスに使用できることを確認できます。

それでそのPRについて

元のコードは次のようになりました

    iat = datetime.datetime.now(tz=datetime.timezone.utc)
    exp = iat   3600
    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": iat,
            "exp": exp,
        }
    )

テストで何か問題があることはわかっていますが、このコードの根本的な問題の解決を妨げたくありません。

PR 作成者が変更を送信しました

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

これは不完全な修正になるように思えました。 API のドキュメントに基づいて、提出された修正では iat が int 型に設定されず、依然として失敗することがわかりました。 PR の
の問題を解決するためのわずかな変更を提案しました。

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

考えれば考えるほど、このサンプルでは Datetime は役に立たないことがわかりました。 Datetime モジュールは、日付が必要な場合に役立つ日付と時刻を操作するためのクラスを提供します。文字通り UTC の整数が必要なので、Time モジュールの方が便利です。

挿入してください、これができます

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now   3600,
        }
    )

このサンプルの完全な (更新された!) コードはここで見つけてください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3