LoginSignup
3
1

More than 3 years have passed since last update.

【Sign In with Apple】iOSアプリから投げられたidentityTokenをPHPで認証する

Last updated at Posted at 2020-03-19

概要

identityToken というJWTがアプリから届いてパースしてsubをユニークキーとして認証するのですが
改ざん防止の為、正しくデコードする必要があります。

細かいことはバージョンが違ったり環境で変わってくると思うので大まかな流れだけ書いておきます。
※コメントで指摘をもらったのですが、これだけではAppleが発行したことしか担保出来ないため
別のアプリからの認証もしてしまうので足りていません。後日ドキュメントを追加するなりします。

追記しました。

  • appleの公開鍵を取得
  • 取得した公開鍵を利用して検証
  • aud で自分のアプリの値かどうか
  • exp で有効期限切れかどうか
  • 問題なければ取得できた値から sub を利用して認証

Sign In with Appleの公式ドキュメントはこちら

以上!!

要所要所の僕が使った部分を以下に記載してるので参考になれば幸いです。

JWTとは

JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。
電子署名により、JSON の改ざんをチェックできるようになっています。

ざっくり言うと、改ざんできない JSON ということになります。

JWT について調べた内容をまとめました。

パースしてみる

こちらのサイトでパース出来るので便利でした。
https://jwt.io/

Appleの鍵を取得する

Appleの鍵はこちらにありました。
Fetch Apple's public key for verifying token signature

Appleの鍵をFirebaseのJWTライブラリが理解出来る形に変更する

JWTの検証にFirebaseのライブラリを使ったのですが、複数の鍵で署名されてる場合
配列で鍵を指定出来るのですが形式が以下のような形なので変換して上げる必要があります。

Appleの鍵の中にあるenを使ってPEMを作れるので頑張って作ります。
この方の記事をめちゃくちゃ参考にさせてもらいました。
【PHP】AzureAPIなどで配布されている公開鍵の「e」「n」とはなにで、どう使うのか

$publicKeys = [
    'kidの値' => 'PEM形式のテキスト',
    'kidの値' => 'PEM形式のテキスト',
];

JWTの検証をして中身を取得する

Firebaseのライブラリを使って
アプリから投げられた identityTokenとさっき作った公開鍵の配列とAppleの鍵に書いてあった alg の値 RS256を指定すれば
改ざんされてなければJSONが返ってきます。

$payload = JWT::decode($identityToken, $publicKeys, ['RS256']);
3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1