概要
identityToken
というJWTがアプリから届いてパースしてsub
をユニークキーとして認証するのですが
改ざん防止の為、正しくデコードする必要があります。
細かいことはバージョンが違ったり環境で変わってくると思うので大まかな流れだけ書いておきます。
※コメントで指摘をもらったのですが、これだけではAppleが発行したことしか担保出来ないため
別のアプリからの認証もしてしまうので足りていません。後日ドキュメントを追加するなりします。
追記しました。
- appleの公開鍵を取得
- 取得した公開鍵を利用して検証
-
aud
で自分のアプリの値かどうか -
exp
で有効期限切れかどうか - 問題なければ取得できた値から
sub
を利用して認証
Sign In with Appleの公式ドキュメントはこちら
以上!!
要所要所の僕が使った部分を以下に記載してるので参考になれば幸いです。
JWTとは
JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。
電子署名により、JSON の改ざんをチェックできるようになっています。ざっくり言うと、改ざんできない JSON ということになります。
パースしてみる
こちらのサイトでパース出来るので便利でした。
https://jwt.io/
Appleの鍵を取得する
Appleの鍵はこちらにありました。
Fetch Apple's public key for verifying token signature
Appleの鍵をFirebaseのJWTライブラリが理解出来る形に変更する
JWTの検証にFirebaseのライブラリを使ったのですが、複数の鍵で署名されてる場合
配列で鍵を指定出来るのですが形式が以下のような形なので変換して上げる必要があります。
Appleの鍵の中にあるe
とn
を使ってPEMを作れるので頑張って作ります。
この方の記事をめちゃくちゃ参考にさせてもらいました。
【PHP】AzureAPIなどで配布されている公開鍵の「e」「n」とはなにで、どう使うのか
$publicKeys = [
'kidの値' => 'PEM形式のテキスト',
'kidの値' => 'PEM形式のテキスト',
];
JWTの検証をして中身を取得する
Firebaseのライブラリを使って
アプリから投げられた identityToken
とさっき作った公開鍵の配列とAppleの鍵に書いてあった alg
の値 RS256
を指定すれば
改ざんされてなければJSONが返ってきます。
$payload = JWT::decode($identityToken, $publicKeys, ['RS256']);