HOPES

Apple IDでログインできる「Appleでサインイン」をPHPで実装する

Apple IDでログインできる「Appleでサインイン」をPHPで実装する

WEBサービスやシステム等で、Apple IDでログインを行うことができるようにするための、PHPでの実装についてです。

Appleでサインインについて

Appleでサインインを自社のシステムに組み込むことで、Apple IDでログインする機能を実現することができます。

Appleでサインインを利用することで、デベロッパのシステムに、名前、認証済みのメールアドレス、一意の永続的なIDを使用してユーザーアカウントを設定することが可能となり、ユーザーがApple IDでAppにサインインできるようになります。

はじめに - Appleでサインイン - Apple Developer

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

Certificates, Identifiers & Profilesのページを開きます。

App IDの登録

まず、App IDの登録を行います。

Certificates, Identifiers & Profiles

新しくApp IDを登録します。


Certificates, Identifiers & Profiles

Appを選択して進めます。


Certificates, Identifiers & Profiles

「Sing In with Apple」にチェックを入れて選択します。


Certificates, Identifiers & Profiles

「Description」と「Bundle ID」を設定して、次に進みます。


Certificates, Identifiers & Profiles

「Register」を押下して登録を完了します。


Certificates, Identifiers & Profiles

「App ID」が登録できたのが確認できます。

Service IDの登録

App IDが登録できたら、続けて、Service IDの登録を行います。

Certificates, Identifiers & Profiles

新しく「Service ID」を登録します。


Certificates, Identifiers & Profiles

「Description」と「Identifier」を設定して、次に進みます。


Certificates, Identifiers & Profiles

「Register」を押下して登録を完了します。


Certificates, Identifiers & Profiles

「Service ID」が登録できたのが確認できます。


Certificates, Identifiers & Profiles

該当の「Service ID」の「Edit your Services ID Configuration」を開いて設定を行います。


Certificates, Identifiers & Profiles

「App ID」の設定と、サービスで利用するドメイン、認証のコールバック先のURLのリストを設定します。


Certificates, Identifiers & Profiles

登録情報の確認を行います。


Certificates, Identifiers & Profiles

最終的に登録した情報を保存します。


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認証

Appleアカウントでログインします。

AppleID認証

メールアドレスをサービスに公開すすか匿名のメールアドレスを通知するかを選択します。

サービス認証のリセット

開発の段階においては、クライアントのAppleIDのサービスの登録をリセットしたい場合があります。その際には、Apple IDを管理からログインして、「Appleでサインイン」の項目から登録されているサービスを削除します。

Appleでサインインの管理

登録済みのサービスを確認します。

Appleでサインインの管理

「「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日に更新されました。