7

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 クラスをオーバーライドすることに注意してください。詳細については、このオープン プル リクエストを確認してください。

4

1 に答える 1