久しぶりに実行してみたら、アマゾン側のログインUIから戻ってきたときにエラーが出るようになってた。 こんなやつ
OpenIdConnectProtocolInvalidAtHashException: IDX10348: Validating the 'at_hash' failed, see inner exception.
id_tokenに含まれるclaimのat_hash
ってやつの検証に失敗している。
結論から言うと、アマゾンが送ってくる値にはパディングの"="が付いているが、検証のときに計算して作った値にはパディングが無いので一致せずに失敗する。仕様的にはパディングを付けないっぽいので、アマゾンから送られた値から"="を取り除いて検証コードに渡すようにした。
options.Events.OnTokenValidated = (context) => { var atHash = context.SecurityToken.Payload["at_hash"] as string; var atHash2 = atHash.Split("=")[0]; context.SecurityToken.Payload["at_hash"] = atHash2; return Task.CompletedTask; };
docs.aws.amazon.com response_type = code だとコード付与フローとなって、id_tokenにat_hashが付いてくる。
at_hashは、AccessTokenのハッシュ値の半分をBase64UrlEncodeしたもの。 Base64UrlEncode自体はパディングはなしともありとも決まってないが、JWTではBase64UrlEncodeした値にはパディングを付けないと決まってる。なので、at_hashに"="付けて送ってくるアマゾンがいかん。