Создание токена разработчика для Apple Musi c API - PullRequest
2 голосов
/ 18 марта 2020

В настоящее время я пытаюсь создать токен разработчика для API MusicKit, у меня есть следующее: 10 di git Team-Id, 10 di git Key-Id, файл .p8 AuthKey. Все они действительны. Я попытался использовать следующий код для генерации токена:

JavaScript в VSCode:

"use strict";
const fs      = require("fs");
const jwt     = require("jsonwebtoken");

const privateKey = fs.readFileSync("AuthKey.p8").toString();
const teamId     = "ABCDEFGHIJ";
const keyId      = "1234567891";

const jwtToken = jwt.sign({}, privateKey, {
    algorithm: "ES256",
    expiresIn: "180d",
    issuer: teamId,
  header: {
    alg: "ES256",
    kid: keyId
  }
});

console.log(jwtToken);

Python (генератор кода pelauimagineering из github с некоторыми незначительными изменениями)

import datetime
import jwt

//not a real private key but it looks something like this
secret = """-----BEGIN PRIVATE KEY-----
asdfg1rty5GSM49AgEGCCqGSM49AwEHBHkwdwIBAQQguWRXMHYkuFImkMGByqEPT
jaXQyO0WK1BjYpuDxIgNQ5nHRRFCuUOi8mgCgYIKoZIzj0DAQehcp0+Z+jwRANCAA
RCBFg8fL08QS36Fb8HmY+eFrDWMO00w5unCo5n8VyLhvttIZeByXlVsJrK/L3f/
F2wYmZme
-----END PRIVATE KEY-----"""
teamId = "ABCDEFGHIJ";
keyId = "1234567891"
alg = 'ES256'

time_now = datetime.datetime.now()
time_expired = datetime.datetime.now() + datetime.timedelta(hours=12)

headers = {
    "alg": alg,
    "kid": keyId
}

payload = {
    "iss": teamId,
    "exp": int(time_expired.timestamp()),
    "iat": int(time_now.timestamp())
}


if __name__ == "__main__":
    """Create an auth token"""
    token = jwt.encode(payload, secret, algorithm=alg, headers=headers)

    print("----TOKEN----")
    print(token)

Однако токены, сгенерированные из обоих сценариев, возвращают HTTP 401. Что я делаю не так? Могу ли я попробовать другие сценарии? Есть ли какие-то дополнительные требования, которые я пропустил? (Помимо Team-ID, Key-ID и AuthKey.p8) Я занимался этим некоторое время, поэтому любая помощь приветствуется! : D

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Я столкнулся с той же проблемой, убедитесь, что ваш файл AuthKey.p8 содержит ключ в одной строке. Ваша выглядит так:

-----BEGIN PRIVATE KEY-----
asdfg1rty5GSM49AgEGCCqGSM49AwEHBHkwdwIBAQQguWRXMHYkuFImkMGByqEPT
jaXQyO0WK1BjYpuDxIgNQ5nHRRFCuUOi8mgCgYIKoZIzj0DAQehcp0+Z+jwRANCAA
RCBFg8fL08QS36Fb8HmY+eFrDWMO00w5unCo5n8VyLhvttIZeByXlVsJrK/L3f/
F2wYmZme
-----END PRIVATE KEY-----

Когда это должно выглядеть так:

-----BEGIN PRIVATE KEY-----
asdfg1rty5GSM49AgEGCCqGSM49AwEHBHkwdwI...
-----END PRIVATE KEY-----
0 голосов
/ 19 марта 2020

Вот скрипт, который я использую. Просто использовал его на прошлой неделе, чтобы повторно добавить мой токен разработчика. Я iOS разработчик (не Python разработчик), поэтому я не могу его устранить. Я просто знаю, что это работает.

# requires pyjwt (https://pyjwt.readthedocs.io/en/latest/)
# pip install pyjwt


import datetime
import jwt


secret = """
-----BEGIN PRIVATE KEY-----
blah...CqGSM...49AwEH...BHkwdw...IBAQQgRESoq...etc
-----END PRIVATE KEY-----
"""

keyId  = "myKeyId"    # https://developer.apple.com/account/ios/authkey/
teamId = "myTeamId"   # https://developer.apple.com/account/#/membership/
alg    = "ES256"

time_now = datetime.datetime.now()
time_expired = datetime.datetime.now() + datetime.timedelta(hours = 4320)   #180d

headers = {
    "kid": keyId,
    "alg": alg
}

payload = {
    "iss": teamId,
    "iat": int(time_now.strftime("%s")),
    "exp": int(time_expired.strftime("%s"))
}


if __name__ == "__main__":
    """Create an auth token"""
    token = jwt.encode(payload, secret, algorithm = alg, headers = headers)

    print "\n----TOKEN----"
    print token

    print "\n----CURL----"
    print "curl -v -H 'Authorization: Bearer %s' \"https://api.music.apple.com/v1/catalog/us/artists/36954\" \n" % (token)


#end
...