Эта строка привлекла мое внимание:
map.add("code", authorizationCode); // JWT code we got from iOS
authorizationCode
не является jwt
JSON Веб-токены состоят из 3 частей, разделенных точками
, но authorizationCode
состоит из 4-х частей:
text1.text2.0.text3
Вы, вероятно, используете identityToken
из приложения iOS вместо authorizationCode
Это как вы его извлекаете:
let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)!
print("authorizationCode: \(authorizationCode)")
Также полезно иметь в виду следующее для тех, кто может прийти сюда после получения той же invalid_client
ошибки:
kid - это идентификатор закрытого ключа от developer.apple.com/account/resources/authkeys/list
keyFile - это файл, содержащий закрытый ключ, загруженный из developer.apple. com
teamID можно найти, войдя на developer.apple.com и нажав на учетную запись, teamID можно увидеть в верхнем правом углу
значение в ауд. Должно быть https://appleid.apple.com
app_id - идентификатор пакета для приложения
Если это может помочь, вот рабочее решение в python для создания client_secret:
# $ pip install pyjwt
import jwt
import time
kid = "myKeyId"
keyFile = "/pathToFile/AuthKey.p8"
key = ""
with open(keyFile, 'r') as myFile:
key = myFile.read()
print(key)
timeNow = int(round(time.time()))
time3Months = timeNow + 86400*90
claims = {
'iss': teamID,
'iat': timeNow,
'exp': time3Months,
'aud': 'https://appleid.apple.com',
'sub': app_id,
}
secret = jwt.encode(claims, key, algorithm='ES256', headers={'kid': kid})
print("secret:")
print(secret)
client_secret = secret.decode("utf-8")
print(client_secret)