Apple IDでログインできる「Appleでサインイン」をPHPで実装する
![Apple IDでログインできる「Appleでサインイン」をPHPで実装する](/wp-content/uploads/2023/01/appleid-login.png)
WEBサービスやシステム等で、Apple IDでログインを行うことができるようにするための、PHPでの実装についてです。
Appleでサインインについて
Appleでサインインを自社のシステムに組み込むことで、Apple IDでログインする機能を実現することができます。
Appleでサインインを利用することで、デベロッパのシステムに、名前、認証済みのメールアドレス、一意の永続的なIDを使用してユーザーアカウントを設定することが可能となり、ユーザーがApple IDでAppにサインインできるようになります。
PHPでの実装
WEBページで実装する場合には、JSのライブラリが用意されていますが、今回はこれを使わずにPHPで実装します。この場合には、認証処理の手続きを手動で実装します。
To add Sign in with Apple to apps that don’t have access to the Sign in with Apple JS framework, you control the sign-in request manually.
Incorporating Sign in with Apple into other platforms | Apple Developer Documentation
Apple Developperで「App ID」と「Service ID」を登録
まずは、Apple製品の開発に必要なApple Developerにログインして、「証明書、ID、プロファイル」の項目の「ID」を選択して、「App ID」と「Service ID」の登録を行います。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_01.png)
Certificates, Identifiers & Profilesのページを開きます。
App IDの登録
まず、App IDの登録を行います。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_02.png)
新しくApp IDを登録します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_03.png)
Appを選択して進めます。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_04.png)
「Sing In with Apple」にチェックを入れて選択します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_05.png)
「Description」と「Bundle ID」を設定して、次に進みます。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_07.png)
「Register」を押下して登録を完了します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_08.png)
「App ID」が登録できたのが確認できます。
Service IDの登録
App IDが登録できたら、続けて、Service IDの登録を行います。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_09.png)
新しく「Service ID」を登録します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_10.png)
「Description」と「Identifier」を設定して、次に進みます。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_11.png)
「Register」を押下して登録を完了します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_12.png)
「Service ID」が登録できたのが確認できます。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_13.png)
該当の「Service ID」の「Edit your Services ID Configuration」を開いて設定を行います。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_14.png)
「App ID」の設定と、サービスで利用するドメイン、認証のコールバック先のURLのリストを設定します。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_16.png)
登録情報の確認を行います。
![Certificates, Identifiers & Profiles](/wp-content/uploads/2022/12/appleid-login_15.png)
最終的に登録した情報を保存します。
Appleでサインインの実装
サービスの登録が完了したので、実装を行います。
AppleにアクセスするURLの作成
ドキュメントを確認しながら、指定のURLにパラメーターを設定します。指定できるscopeは、「name」と「email」となっています。
Send the required query parameters
Direct the authorization request using the HTTP GET method to the URL: appleid.apple.com/auth/authorize. The URL contains the following parameters:
Incorporating Sign in with Apple into other platforms | Apple Developer Documentation
PHPのコードで実装すると以下のようになります。
<?php
$base_url = "https://appleid.apple.com/auth/authorize";
$params = array();
$params["client_id"] = "332.service";
$params["scope"] = "name email";
$params["response_type"] = "code id_token";
$params["redirect_uri"] = 'https://www.332.hn/login/apple/auth';
$params["response_mode"] = "form_post";
$redirect_url = $base_url ."?".http_build_query($params);
header('Location: ' .$redirect_url);
Apple IDでの認証
ブラウザでURLにアクセスすると、Appleの認証画面に推移するので、クライアントで利用するApple IDで認証を行います。
![AppleID認証](/wp-content/uploads/2023/01/appleid-login_16.png)
Appleアカウントでログインします。
![AppleID認証](/wp-content/uploads/2023/01/appleid-login_17.png)
メールアドレスをサービスに公開すすか匿名のメールアドレスを通知するかを選択します。
サービス認証のリセット
開発の段階においては、クライアントのAppleIDのサービスの登録をリセットしたい場合があります。その際には、Apple IDを管理からログインして、「Appleでサインイン」の項目から登録されているサービスを削除します。
![Appleでサインインの管理](/wp-content/uploads/2023/01/appleid-login_18.png)
登録済みのサービスを確認します。
![Appleでサインインの管理](/wp-content/uploads/2023/01/appleid-login_19.png)
「「Appleでサインイン」の使用を停止」を押下して削除します。
Appleから認証情報を確認
Appleでの認証が完了すると、指定したサービスのコールバックURLに戻ってきます。
確認すると、以下のような情報を取得できていることが確認できます。
<?php
var_dump($_POST);
array(3) {
["code"]=>
string(62) "c1807723c3a0d418b9fb4787ecdcde1c1.0.rrz.POIbqaLgzZvDiHUQbGQWNw"
["id_token"]=>
string(769) "eyJraWQiOiJmaDZCczhDIiwiYWxnIjoiUlMyNTYifQ...."
["user"]=>
string(82) "{"name":{"firstName":"","lastName":""},"email":""}"
}
注意としてあるのが、「 [“user”]は、クライアントの初回の認証時のみに取得することができ、2回目以降は、取得できないようです。
array(2) {
["code"]=>
string(62) "c39c4a197eeb4462bb2e0b1e0711c507e.0.rrz.ou8dWU1Nj15y2C3HpVytog"
["id_token"]=>
string(769) "eyJraWQiOiJmaDZCczhDIiwiYWxnIjoiUlMyNTYifQ...."
}
また、クライアントが、認証の初回の際に、「メールを非公開」を選択した場合には、ランダムなメールアドレスが設定され、2回目以降もこのメールアドレスが通知されるようです。
array(3) {
["code"]=>
string(62) "ce2e675a9ea854425ae119f05b10c2522.0.rrz.l9wGMzsiRmdBMdf7Q-X4Ag"
["id_token"]=>
string(826) "eyJraWQiOiJXNldjT0tCIiwiYWxnIjoiUlMyNTYifQ...."
["user"]=>
string(99) "{"name":{"firstName":"","lastName":""},"email":"dwth22b5pv@privaterelay.appleid.com"}"
}
システムに組み込むための実装
PHPの処理で、まとめると、以下のような処理をすることで、Appleからの情報を受け取ることができます。あとは、システムに合わせて詳細の実装を行えばよいかと思います。
<?php
$code = json_decode(htmlspecialchars($_POST["code"]),true);
var_dump($code);
if(isset($_POST["user"]))
{
$user = json_decode(htmlspecialchars($_POST["user"]),true);
var_dump($user);
}
$id_token_array = explode(".", htmlspecialchars($_POST["id_token"]));
$data = json_decode(base64_decode($id_token_array[1]), true);
var_dump($data);
2023年01月10日に投稿されました。
2023年01月15日に更新されました。