为 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 创建开发者令牌的主要内容,如果未能解决你的问题,请参考以下文章

获取库播放列表艺术品 Apple Music API

如何调用 Apple Music API 并避免 401

是否还有办法在 iTunes Store 而不是 Apple Music 中打开 iTunes 搜索 API trackViewUrl?

连接到 Apple Music

重新创建 Apple Music UINavigationController 标题箭头

无法使用 JWT 令牌连接到 Apple App Store API