我正在尝试验证我在重定向Uri上从“使用Apple登录”服务获得的代码。我使用了文档中的信息来创建发布数据并生成“ client_secret”。
我得到的回应是:{"error":"invalid_client"}。
我的生成“ client_secret”的函数可以在下面找到:
function encode($data) {
$encoded = strtr(base64_encode($data), '+/', '-_');
return rtrim($encoded, '=');
}
function generateJWT($kid, $iss, $sub, $key) {
$header = [
'alg' => 'ES256',
'kid' => $kid
];
$body = [
'iss' => $iss,
'iat' => time(),
'exp' => time() + 3600,
'aud' => 'https://appleid.apple.com',
'sub' => $sub
];
$privKey = openssl_pkey_get_private($key);
if (!$privKey) return false;
$payload = encode(json_encode($header)).'.'.encode(json_encode($body));
$signature = '';
$success = openssl_sign($payloads, $signature, $privKey, OPENSSL_ALGO_SHA256);
if (!$success) return …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此库实现 Apple 登录到 Android 应用程序。文档中描述了主要流程:库在Android端返回授权码。必须将此授权代码发送到我的后端,后端又将其发送到 Apple 服务器以取回访问令牌。
如此处和此处所述,为了获取访问令牌,我们需要向 Apple API 发送参数列表、授权代码和签名的 JWT。特别是,JWT 需要使用 ES256 算法使用私有 .p8 密钥进行签名,该密钥必须从 Apple 开发者门户生成和下载。苹果文档
这是我的 PHP 脚本:
<?php
$authorization_code = $_POST('auth_code');
$privateKey = <<<EOD
-----BEGIN PRIVATE KEY-----
my_private_key_downloaded_from_apple_developer_portal (.p8 format)
-----END PRIVATE KEY-----
EOD;
$kid = 'key_id_of_the_private_key'; //Generated in Apple developer Portal
$iss = 'team_id_of_my_developer_profile';
$client_id = 'identifier_setted_in_developer_portal'; //Generated in Apple developer Portal
$signed_jwt = $this->generateJWT($kid, $iss, $client_id, $privateKey);
$data = [
'client_id' => $client_id,
'client_secret' => $signed_jwt, …Run Code Online (Sandbox Code Playgroud)