为 Apple Music API 创建开发者令牌

Posted

技术标签:

【中文标题】为 Apple Music API 创建开发者令牌【英文标题】:Creating A Developer Token For Apple Music API 【发布时间】:2020-06-29 00:23:53 【问题描述】:

我目前正在尝试为 MusicKit API 创建一个开发者令牌,我有以下内容: 10 位 Team-Id,10 位 Key-Id,一个 .p8 AuthKey 文件。所有这些都是有效的。我尝试使用以下代码生成令牌:

VSCode 中的 javascript

"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

【问题讨论】:

【参考方案1】:

这是我使用的脚本。上周刚刚用它来重新升级我的开发人员令牌。我是一名 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

【讨论】:

这与我在 strftime 中使用的脚本相同(在 Windows 上不起作用,与时间戳相同) 这仍然是 401【参考方案2】:

我遇到了同样的问题,请确保您的 AuthKey.p8 文件在一行中有密钥。 你的看起来像这样:

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

什么时候应该是这样的:

-----BEGIN PRIVATE KEY-----
asdfg1rty5GSM49AgEGCCqGSM49AwEHBHkwdwI...
-----END PRIVATE KEY-----

【讨论】:

谢谢,已修复! 嗯,对我来说没什么区别

以上是关于为 Apple Music API 创建开发者令牌的主要内容,如果未能解决你的问题,请参考以下文章