🙆

Firebase Authentication の jwks の場所

2023/05/10に公開

TL; DR

  • OpenID Connect では、/.well-known/openid-configuration にメタデータが置かれていて、その中に jwks_uri として jwks の場所が記載されている
  • Firebase Auth の場合は、https://securetoken.google.com/{{project-id}}/.well-known/openid-configuration にメタデータがある
  • Firebase Auth の jwks は https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com にある (上記のメタデータより)

Firebase Authentication の公開鍵が欲しい

  • 例えば、Firebase の SDKが用意されていない Ruby で、IDトークンの検証を行う場合に Firebase Authentication (Firebase Auth) の公開鍵が欲しい
  • では、その公開鍵はどこにあるのか
  • 公式ドキュメントを見に行くと、書いてる

https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com から公開鍵を取得し、JWT ライブラリを使用して署名を確認します。

https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja

機械的に探すことはできないか

  • ドキュメントを見ることで公開鍵のURLを見つけて、公開鍵を取得することができた
  • しかし、仕様等に従って機械的に見つける必要もあるはずで、その方法を知りたい
    • こう思ったきっかけとして、AWS Lambda の JWT Authorizer に iss(issuer) と aud(audience) だけを指定して、署名の検証までされたのでなんでだろうと思ったことがある

Open ID Connect のメタデータ

  • Auth0 の記事とか、RFC8414 とかが参考になりそう
  • OpenID Connect では、{{iss}}/.well-known/openid-configuration にメタデータが置かれている
  • Firebase Auth の場合、 https://securetoken.google.com/{{project-id}}/.well-known/openid-configuration にある
  • Firebase Auth で発行したIDトークンをデコードしてみると、"iss": "https://securetoken.google.com/{{project-id}}" になっているので、プレフィックスがこれで、パスが /.well-known/openid-configuration
    • AWS Lambda の JWT Authorizer 登録時に issueraudience は登録済 (もちろん、issuer は先述の iss と同じ値)
  • 中身は以下の通りのJSONで、発行者 (issuer) や 公開鍵の場所 (jwks_uri) 等が入っている
{
  "issuer": "https://securetoken.google.com/{{project-id}}",
  "jwks_uri": "https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com",
  "response_types_supported": [
    "id_token"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ]
}
  • jwks_uri の場所に jwks があるので、これを見に行けば公開鍵が取得できる
  • ここまでをまとめると
    • IDトークンの issuer を確認
    • {{iss}}/.well-known/openid-configuration を見に行く
    • JSONが得られるので、その中の jwks_uri を確認
    • jwks_uri の記載のURIを見に行くと、jwks を取得できる

参考

Discussion