Apple でサインインする方法を理解するのに苦労しています。ドキュメンテーションはひどいものであり、失敗した応答は私たちに無知を残します。Aaron Parecki の記事 ( https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple ) は少し役に立ちますが、今は立ち往生しているようです.
最初に、次のように /auth/authorize を使用してログイン URL を生成します。
$_SESSION['state'] = bin2hex(openssl_random_pseudo_bytes(16));
return 'https://appleid.apple.com/auth/authorize?' . http_build_query([
'response_type' => 'code',
'response_mode' => 'form_post',
'client_id' => 'com.my.service.id',
'redirect_uri' => 'https://my.app/redirect'),
'state' => $_SESSION['state'],
'scope' => 'name email',
]);
ドメインの検証とリターン URL に苦労した後、Apple のログイン ページに移動し、ログインに成功すると、redirect_uri に戻ります。次に、Guzzle を使用して実行するトークンを承認する必要があります。
$response = (new Client)->request('POST', 'https://appleid.apple.com/auth/token', [
RequestOptions::FORM_PARAMS => [
'grant_type' => 'authorization_code',
'code' => $_POST['code'],
'redirect_uri' => 'https://my.app/redirect',
'client_id' => 'com.my.service.id',
'client_secret' => $this->getClientSecret(),
],
RequestOptions::HEADERS => [
'Accept' => 'application/json'
]
]);
return json_decode($response, true);
クライアント シークレットは、Firebase php-jwt ( https://github.com/firebase/php-jwt ) を使用して生成され、jwt.io を通じて有効になります。
$key = openssl_pkey_get_private('file://certificate.p8');
return JWT::encode([
'iss' => 'APPLETEAMID',
'iat' => time(),
'exp' => time() + 3600,
'aud' => 'https://appleid.apple.com',
'sub' => 'com.my.service.id',
], $key, 'ES256', 'certificate-id');
ただし、Apple へのトークン要求を実行すると、「invalid_client」というメッセージとともに 400 エラーが返されます。client-id/secret が間違っているのか、リダイレクトからのコードが無効なのかわかりません。誰かが私を正しい方向に向けることができますか?
編集: ES256 を使用できるように、JWT クラスをオーバーライドすることに注意してください。詳細については、このオープン プル リクエストを確認してください。