Open7

LINEログインの認証認可をいじくり回す(アクセストークン及びIDトークン)

kcabokcabo
  • アクセストークンはリソース(ユーザーのプロフィール情報など)へのアクセス権限を証明するためのトークン
  • IDトークンはユーザー情報を含むJWT。Base64でデコードすれば「とりあえずは」ユーザー情報の中身が見られる。したがってアクセストークンよりも文字列長は長い
kcabokcabo

手動で署名の検証をしてみる

https://liff-playground.netlify.app/
LINE公式のプレイグラウンド。

  1. PCでもよいので開いてログインしてみる
  2. liff.getIDToken()のところからIDトークンが得られる
  3. https://jwt.io/ でデコードができる
  4. ヘッダー部分のkidをコピーする
  5. https://api.line.me/oauth2/v2.1/certs ここから先程のkidに一致するものを探す
  6. その部分を https://jwt.io/のVERIFY SIGNATUREにあるPublicKeyの欄にコピペする
  7. Signature Verifiedと出ればOK
kcabokcabo

https://10015.io/tools/jwt-encoder-decoder
こちらでも検証ができる。Verify JWT signature?にチェックを入れてPublicKeyを入力する
しかしここだとJWK形式のものをそのままいれても弾かれる
JWK→PEMに変換しなきゃいけないがこれまた面倒くさい

https://8gwifi.org/jwkconvertfunctions.jsp
↑このクソ怪しいサイトでできるが入力情報をそのままサーバーに送信している模様。公開鍵といえども。。。

https://github.com/Brightspace/node-jwk-to-pem
おとなしくローカルでやろう

kcabokcabo

公式の検証方法

https://developers.line.biz/ja/docs/line-login/verify-id-token/#get-profile-info-from-id-token
エンドポイントを利用する or 自前のコードでやる

結局、一番いいのはLINEが提供している検証用のエンドポイントを使うこと

https://developers.line.biz/ja/reference/line-login/#verify-id-token
POST https://api.line.me/oauth2/v2.1/verify

自前のコードでもできる

https://developers.line.biz/ja/docs/line-login/verify-id-token/#write-original-code
こちらにある感じ、LINEの公開鍵による検証じゃなく、自分のチャネルの秘密鍵(チャネルシークレット)で検証している。つまりチャネルシークレットを使って自前で署名を作成し、受け取った署名部分と突合している。

https://assets.ctfassets.net/2ntc334xpx65/5HColfm15cUhMmDQnupNzd/30d5913d94e79462043f6d8e3f557351/jwt-handbook-jp.pdf
jwtに対する様々な攻撃手法が確認されている。もしやるなら自前のコードは極力減らし、信頼できるライブラリに頼るようにしたい