at_hashのバリデーションに失敗するから対処した

azechi-n.hatenadiary.com

久しぶりに実行してみたら、アマゾン側のログインUIから戻ってきたときにエラーが出るようになってた。 こんなやつ

OpenIdConnectProtocolInvalidAtHashException: IDX10348: Validating the 'at_hash' failed, see inner exception.

id_tokenに含まれるclaimのat_hashってやつの検証に失敗している。

結論から言うと、アマゾンが送ってくる値にはパディングの"="が付いているが、検証のときに計算して作った値にはパディングが無いので一致せずに失敗する。仕様的にはパディングを付けないっぽいので、アマゾンから送られた値から"="を取り除いて検証コードに渡すようにした。

github.com

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に"="付けて送ってくるアマゾンがいかん。