Как проверить код из "Войти через Apple"?

Я пытаюсь проверить код, полученный от службы "Войти через Apple" в моем URI перенаправления. Я использовал информацию из документации для создания данных публикации и генерации "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 false;

    return $payload.'.'.encode($signature);
}

Мои переменные в этом примере:

$ kid - мой идентификатор для моего личного ключа. В этом примере это JYJ5GS7N9K. Я получил идентификатор отсюда https://developer.apple.com/account/resources/authkeys/list

$ iss - это идентификатор моей команды из моей учетной записи разработчика. В этом примере это WGL33ABCD6.

$ sub имеет то же значение, что и "client_id". Мой "client_id" в этом примере - "dev.hanashi.sign-in-with-apple". Я получил идентификатор клиента из идентификаторов приложения здесь: https://developer.apple.com/account/resources/identifiers/list

$ key - это мой сгенерированный закрытый ключ от учетной записи разработчика. Ключ имеет следующий формат:

-----BEGIN PRIVATE KEY-----
myrandomgeneratedkeybyappledeveloperaccount
-----END PRIVATE KEY-----

Это код php для запроса:

$key = <<<EOD
-----BEGIN PRIVATE KEY-----
myrandomgeneratedkeybyappledeveloperaccount
-----END PRIVATE KEY-----
EOD; // replaced with correct key

$kid = 'JYJ5GS7N9K'; // identifier for private key
$iss = 'WGL33ABCD6'; // team identifier
$sub = 'dev.hanashi.sign-in-with-apple'; // my app id

$jwt = generateJWT($kid, $iss, $sub, $key);

$data = [
    'client_id' => $sub,
    'client_secret' => $jwt,
    'code' => $_POST['code'],
    'grant_type' => 'authorization_code',
    'request_uri' => 'https://myurl.tld/redirect.php'
];
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://appleid.apple.com/auth/token');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6');

$serverOutput = curl_exec($ch);

curl_close ($ch);
echo $serverOutput;

Теперь я получаю ответ {"error":"invalid_client"} с сервера Apple. Что я делаю неправильно? Может быть, я неправильно генерирую токен JWT?

Ответ 1

Проблема для меня заключалась в том, что я забыл подтвердить свой домен в разделе Service Id портала Apple dev.

Вам нужно скачать ключ, который они вам дают, и загрузить его по адресу: https://example.com/.well-known/apple-developer-domain-association.txt

Веб-сайт не проверяет автоматически, вы должны нажать кнопку подтверждения и получить зеленую галочку рядом с доменом, чтобы быть уверенным. После этого у меня больше не было проблем invalid_client.

enter image description here

Ответ 2

Прочитайте это, и вы получите лучшее понимание "Войти через Apple".