You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决使用MusicKit调用个人库接口时的403 Forbidden错误

Apple Music个人库API 403 Forbidden错误排查与解决

问题回顾

你通过Python生成JWT服务器令牌,调用Apple Music目录API正常,但请求个人库/v1/me/library/albums时返回403错误,错误信息为Invalid authentication。当前使用的Music-User-Token(MUT)是从P8密钥文件中获取的,希望后续上架App Store供其他用户使用,不想依赖个人专属令牌。

核心错误原因

  1. MUT来源误用:P8密钥是生成服务器端JWT令牌(即你代码中的token)的凭证,并非MUT。MUT是与用户Apple Music账号绑定的授权令牌,必须通过用户OAuth2授权流程获取。
  2. 请求头格式错误:你的curl命令中Music-User-Token字段多了Bearer前缀,正确格式应为Music-User-Token: {MUT},不需要额外添加Bearer。

解决方案与说明

1. 正确获取MUT

  • 开发测试阶段:
    可通过个人Apple账号获取测试用MUT:在iOS测试App中调用SKCloudServiceController.requestUserToken(forDeveloperToken:completionHandler:)接口,获取与你账号绑定的MUT,将其复制到Python脚本中即可测试个人库API。该令牌仅能访问你的个人库,适合开发调试。
  • 上线后供用户使用:
    必须实现完整的Apple Music OAuth2授权流程:引导用户跳转至Apple登录授权页面,用户授权后你会拿到授权码,再用授权码兑换成MUT(含刷新令牌,用于续期)。此流程需在Apple开发者后台配置应用回调URL等信息。

2. Python中认证与请求的调整

修正curl命令格式

将个人库请求的curl命令修改为:

curl -v -H 'Music-User-Token: {正确的MUT}' -H 'Authorization: Bearer {你的JWT令牌}' "https://api.music.apple.com/v1/me/library/albums"

Python直接发起请求示例(使用requests库)

import datetime
import jwt
import requests

secret = """
-----BEGIN PRIVATE KEY-----
{Insert Private Key Here}
-----END PRIVATE KEY-----
"""

keyId  = "{Insert KeyID Here}"
teamId = "{Insert TeamID Here}"
alg    = "ES256"

time_now = datetime.datetime.now()
time_expired = datetime.datetime.now() + datetime.timedelta(hours=4320)  # 180天有效期

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

payload = {
    "iss": teamId,
    "iat": int(time_now.timestamp()),  # 用timestamp()替代strftime更可靠
    "exp": int(time_expired.timestamp())
}

if __name__ == "__main__":
    # 生成服务器JWT令牌
    token = jwt.encode(payload, secret, algorithm=alg, headers=headers)
    # 替换为通过授权获取的有效MUT
    valid_mut = "{你的测试/用户授权MUT}"

    # 发起个人库请求
    library_url = "https://api.music.apple.com/v1/me/library/albums"
    request_headers = {
        "Authorization": f"Bearer {token}",
        "Music-User-Token": valid_mut
    }

    response = requests.get(library_url, headers=request_headers)
    print(response.status_code)
    print(response.json())

3. 开发初期测试注意事项

  • 无需提前部署应用,只要你的开发者账号开通了MusicKit权限,即可用测试MUT调用个人库API。
  • 测试用MUT有效期有限,过期后需重新获取。

内容的提问来源于stack exchange,提问作者tlcs30

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:20:36