Open7
LINEログインの認証認可をいじくり回す(アクセストークン及びIDトークン)
- アクセストークンはリソース(ユーザーのプロフィール情報など)へのアクセス権限を証明するためのトークン
- IDトークンはユーザー情報を含むJWT。Base64でデコードすれば「とりあえずは」ユーザー情報の中身が見られる。したがってアクセストークンよりも文字列長は長い
共通仕様を理解したほうが早い
←神記事時間があれば公式Docも読みたい
手動で署名の検証をしてみる
LINE公式のプレイグラウンド。
- PCでもよいので開いてログインしてみる
-
liff.getIDToken()
のところからIDトークンが得られる - https://jwt.io/ でデコードができる
- ヘッダー部分の
kid
をコピーする -
https://api.line.me/oauth2/v2.1/certs ここから先程の
kid
に一致するものを探す - その部分を https://jwt.io/の
VERIFY SIGNATURE
にあるPublicKeyの欄にコピペする -
Signature Verified
と出ればOK
Verify JWT signature?
にチェックを入れてPublicKeyを入力する
しかしここだとJWK形式のものをそのままいれても弾かれる
JWK→PEMに変換しなきゃいけないがこれまた面倒くさい
↑このクソ怪しいサイトでできるが入力情報をそのままサーバーに送信している模様。公開鍵といえども。。。
おとなしくローカルでやろう
公式の検証方法
エンドポイントを利用する or 自前のコードでやる
結局、一番いいのはLINEが提供している検証用のエンドポイントを使うこと
POST https://api.line.me/oauth2/v2.1/verify
自前のコードでもできる
こちらにある感じ、LINEの公開鍵による検証じゃなく、自分のチャネルの秘密鍵(チャネルシークレット)で検証している。つまりチャネルシークレットを使って自前で署名を作成し、受け取った署名部分と突合している。
jwtに対する様々な攻撃手法が確認されている。もしやるなら自前のコードは極力減らし、信頼できるライブラリに頼るようにしたい
こちらGoogleの公開鍵
RSA暗号LINEのほうは楕円曲線暗号と呼ばれるもの。
数学勉強したいね