我很难弄清楚如何使用 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 执行令牌请求会返回 400 错误并显示消息“invalid_client”。我无法确定我的客户端 ID/密码是否错误,或者重定向的代码是否无效。有人可以指出我正确的方向吗?
编辑:请注意我重写了 JWT 类,允许使用 ES256。有关更多信息,请查看此开放拉取请求。