🙆
Firebase Authentication の jwks の場所
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 ライブラリを使用して署名を確認します。
機械的に探すことはできないか
- ドキュメントを見ることで公開鍵のURLを見つけて、公開鍵を取得することができた
- しかし、仕様等に従って機械的に見つける必要もあるはずで、その方法を知りたい
- こう思ったきっかけとして、AWS Lambda の JWT Authorizer に
iss
(issuer
) とaud
(audience
) だけを指定して、署名の検証までされたのでなんでだろうと思ったことがある
- こう思ったきっかけとして、AWS Lambda の JWT Authorizer に
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 登録時に
issuer
とaudience
は登録済 (もちろん、issuer
は先述のiss
と同じ値)
- AWS Lambda の JWT Authorizer 登録時に
- 中身は以下の通りの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 を取得できる
- IDトークンの
参考
Discussion