Apple 的 MusicKit JS 库示例在由 Node.js 呈现时运行良好,但在 Django 中失败

问题描述

三个小时以来,我一直在为此挠头。

Apple 的 MusicKit 使用 JWT tokens 进行身份验证。

当我npm start this Node.js example project 时,我可以生成 JWT 令牌,然后授权 Apple Music 并收集用户令牌作为响应。这在从 localhost:8080 执行时有效。 Here is a successful pop-up window.

当我在本地启动 Django 服务器并生成有效的 JWT 令牌,使用新的 JWT 令牌运行完全相同的 HTML 代码时,我从 Apple 收到此信息:"Problem Connecting: There may be a network issue."

Apple.com 授权页面上的唯一错误是:vendor-2c0b12a9762d9af673e21ccd8faf615e.js:2325 Error while processing route: woa Failed to construct 'URL': Invalid URL TypeError: Failed to construct 'URL': Invalid URL

我已经确认两个应用程序都在生成有效的 JWT 令牌。我可以直接通过 Apple API 使用我的 Django 应用程序和 Postman 中生成的令牌,以及来自 Node.js 应用程序的令牌。

我试过了:

  1. 在 Node.js 应用中使用来自 Django 的 JWT 令牌 -- 有效
  2. 在 Django 中使用来自 Node.js 应用程序的 JWT 令牌 -- 仍然失败
  3. 允许所有主机访问 Django
  4. 允许所有 CORS 流量到 Django
  5. HTTPS 有效证书上的托管页面。域与本地
  6. 不同的浏览器/计算机
  7. 在新选项卡中直接从 Node.js 访问授权 URL -- 失败
  8. 在新选项卡中直接从 Django 访问授权 URL -- 失败
  9. 破坏 JWT 令牌并将其与 Django 一起使用 -- 失败,甚至没有打开授权窗口(控制台说无效令牌,因此这进一步证明我使用的令牌对 Django 有效)

从第 7 步 / 8 步开始,在 JS 脚本运行和授权弹出窗口出现之间的转介过程中会出现某些情况,因为令牌显然有效。

那么 Django(开发服务器)会做什么来破坏这个授权流程?还是我错过了什么?

解决方法

好吧,我是对的,这与发出请求时 Node.js 服务器向 Apple.com 公开的内容有关,而不是 Django 所做的。

归结为 Django 服务器的“Referrer-Policy”政策。

默认情况下它在 Django 上是“同一站点”,这意味着推荐信息不会分发到 Apple.com,因此 Apple 无法验证请求的来源。

我在 Django 视图渲染中添加了以下标题:

# Create the render variable
response = render(request,'apple.html'.format(settings.BASE_DIR),{'apple_developer_token': apple.get_token()})

# Attach the header
response['Referrer-Policy'] = 'origin-when-cross-origin'

# Return the render
return response

然后就成功了。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...