Shogo's Blog

Aug 12, 2025 - 1 minute read - github

GitHubがJWTのb64ヘッダーパラメーターを認識するようになった

こんな罠に引っかかるのは僕だけだと思うんですが、一応記録として残しておきます・・・。

TL;DR

  • 2025-08-09あたりから、GitHubがJWTのb64ヘッダーパラメーターを認識するようになった
  • 具体的にはJWTのヘッダーに {"b64": false} が含まれている場合に、“A JSON web token could not be decoded, documentation_url: https://docs.github.com/rest" というエラーメッセージが返ってくる

原因

GitHub Appsにアクセスするのに、お勉強も兼ねて自前実装のJWTエンコーダーを使っていました。

JWSのペイロードは普通base64エンコードされていますが、base64エンコードをスキップする拡張が提案されています。

もちろん時前実装のJWTエンコーダーでも対応しました。

しかし、そこにバグがあったのです! payloadをbase64エンコードしているのにもかかわらず、{"b64": false} が設定された状態になっていました。

JWTのヘッダーの中身:

{
  "cty": "JWT",
  "alg": "RS256",
  "b64": false
}

実際のペイロードの内容と、ヘッダーの情報が食い違っており、要するにもとから壊れたJWTを送っていたのです。 今まではたまたまGitHubが受け入れてくれる状態でした。

GitHub 側の改修

おそらく b64 ヘッダーパラメーターをチェックするようになったのだと思います。 この改修により、今までは許容されていた {"b64": false} 付きのJWTが使えなくなりました。

対応

そもそも {"b64": false} のJWTは使用してはならない (MUST NOT) とRFC 7797 Section 7で明記されています。

For interoperability reasons, JSON Web Tokens [JWT] MUST NOT use “b64” with a “false” value.” (RFC 7797 Section 7)

そのため “b64” の設定を削除してしまえば解決です。

JWTのヘッダーの中身:

{
  "typ": "JWT",
  "alg": "RS256"
}

まとめ

GitHub側の仕様変更により、今まで使っていたJWTのアクセストークンが使えなくなってしました。 もともと壊れたトークンを送っていたので、自業自得ですね・・・。

みんなは、多くの人が使っている枯れた実装を使いましょう!

ぴょんと跳ねて書いたメモ、b64はもう不要だよ
ヘッダと中身、仲直り—整合こそが道しるべ
GitHubの門は厳しくなったけれど
RFCの月明かり、正道を照らす
うさぎの耳で聞いた答えはひとつ:削ろう、そして進もう 🥕

by CodeRabbit

参考