从前端 JavaScript 代码获取 Spotify API 访问令牌

IT技术 javascript jquery express cors spotify
2021-03-22 10:10:44

我有一个网络应用程序,允许人们生成与特定艺术家相关的艺术家的歌曲列表。我希望能够连接到用户的 Spotify 帐户并从该歌曲列表中为他们创建一个播放列表,但我需要获取访问令牌。我有一个开发者帐户和客户 ID,我正在尝试通过授权流程,但它对我不起作用。相反,我收到此错误:XMLHttpRequest cannot load https://accounts.spotify.com/authorize/?client_id=d137fe25b31c4f3ba9e29d85f…:3000/callback&scope=user-read-private%20user-read-email&state=34fFs29kd09. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

这是我的scripts.js文件的一部分(我正在使用spotify-web-api-js节点module):

$('#spotify').on('click', function() {
    $.support.cors = true;
    $.getJSON("https://accounts.spotify.com/authorize/?client_id=d137fe25b31c4f3ba9e29d85f4e47c66&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&scope=user-read-private%20user-read-email&state=34fFs29kd09", function(json2){
    $.getJSON("https://accounts.spotify.com/api/token/?grant_type=authorization_code&code=" + json2.code + "&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&client_id=d137fe25b31c4f3ba9e29d85f4e47c66&client_secret={...}", function(json3) {
      s.setAccessToken(json3.access_token);
      });
    });
  });
});

根据我的研究,这是一个与 CORS 相关的问题。我正在编辑我的 ExpressJS 服务器以解决这个跨域问题并安装了cors节点module,但我仍然遇到同样的错误。

index.js 服务器:

var express = require('express');
var cors = require('cors');
var app = express();
var port = 3000;

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});


 app.use(express.static(__dirname + '/public')); // looks in public directory, not root directory (protects files)

 app.get('/', function(req, res) {
     res.send(__dirname + '\\index.html')
});

app.listen(port, function() {
          console.log('CORS-enabled web server listening on port ' + port);
});

当我直接通过浏览器访问有问题的 URL 时,它给了我预期的“您是否授权此应用使用您的 Spotify 信息”表单。

我应该在“scripts.js”中要求“cors”才能工作吗?有人有其他建议吗?

1个回答

我相信这里的问题是您试图从应该引导用户的端点检索 JSON 数据。因此,与其向它发出请求,不如在您的页面上提供一个链接到您的https://accounts.spotify.com/authorize/ {...} URL的按钮用户将继续向您的应用程序授予您在scope参数中指定的权限,并将被定向回您在redirect_uri参数中指定的 URL 这是您获取授权代码的地方,您可以在https://accounts.spotify.com/api/token/ {...} 端点中使用该代码授权指南中阅读有关授权代码流程的更多信息

Spotify Web API 支持三种不同的 oAuth 流程,您可能对Implicit Grant感兴趣https://github.com/spotify/web-api-auth-examples提供了使用 Node 用 Ja​​vascript 编写的所有这些流程的示例

jQuery 文档会有所帮助,也许是api.jquery.com/jquery.post不过,这是一个单独的问题,所以我认为它需要一个不同的 Stack Overflow 问题。
2021-05-02 10:10:44
同意,所以我要结束这个并接受你的回答——它帮助我解决了眼前的问题!
2021-05-09 10:10:44
我相信它正在执行 GET 请求而不是 POST ......我如何确保这不会发生?
2021-05-12 10:10:44
谢谢,这有助于解决这个问题。但是,在我授权应用程序使用我的 Spotify 信息后,它重定向到Cannot GET /callback?code={bunch of random letters and numbers I haven't seen before},并且这里的 oAuth 流程或其他答案似乎都无法很好地解释这个问题。localhost:3000/callback在开发人员设置中将(3000 是我的服务器端口)列为重定向。getJSON在用户点击链接后,我试图通过不同的函数检索访问令牌&json未定义,这可能是问题吗?
2021-05-20 10:10:44
code参数中的值称为授权码。您的应用程序可以通过向accounts.spotify.com/api/token发送POST请求来发送此代码,如developer.spotify.com/web-api/authorization-guide/... 上的步骤 4 中所述(您可能发送的是而不是。)确保您的本地 Web 服务器在端口 3000 上运行,并且您在developer.spotify.com 的“我的应用程序”中配置的重定向 URI 具有端口 3000以及。GETPOST
2021-05-21 10:10:44