允许前端 JavaScript POST 请求到 https://accounts.spotify.com/api/token 端点

Posted

技术标签:

【中文标题】允许前端 JavaScript POST 请求到 https://accounts.spotify.com/api/token 端点【英文标题】:Allowing frontend JavaScript POST requests to https://accounts.spotify.com/api/token endpoint 【发布时间】:2016-01-16 07:10:52 【问题描述】:

为了在我的网络应用程序中获取 Spotify API 的访问令牌(由他们的网络授权流程指定),我了解到我必须发出 POST 请求。但是,当我这样做时,由于跨域问题,我得到了XMLHttpRequest 500 Error

我已经想出了如何允许 CORS GET 请求,但不确定如何为 POST 请求做同样的事情。 This link 提供配置提示,但将 GETPOST 的实际路由留空。

这是我的 Express.js 服务器的相关代码:

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.header("Access-Control-Allow-Origin", "*");
  // res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.send(__dirname + '\\index.html')
);

app.post('/', function(req, res) 
    res.send(req.body.spotify);
);

spotifyspotify-web-api-js 节点模块)。

我之前尝试将app.get 的确切代码复制到app.post,但这会导致服务器崩溃。

这是我程序的 javascript 文件中的一段代码,它打算在用户单击一个按钮后发送POST 请求,该按钮将他们带到 Spotify 授权路径的开头并批准登录:

$('#spotify').on('click', function() 
    $.support.cors = true;

    $.post("https://accounts.spotify.com/api/token");

      );

(在这种情况下,spotify 是 HTML 文件中按钮的 ID)

在这种情况下,我应该怎么做才能绕过 CORS 问题?这几天我都被难住了。

【问题讨论】:

您的服务器无法代表他们授予对 Spotify API 的访问权限(通过 CORS 或其他方式)。他们的应用程序本身必须以必要的标头响应以允许请求。如果没有,则客户端可能根本无法发出请求。旁注:有用于在 Node HTTP 应用程序中启用 CORS 的现有包,包括 cors。此外,对于除了最基本的请求之外的所有请求,可能会在它们之前发送preflight OPTIONS 请求。 我已经安装了cors 包,但是我找不到POST 请求的任何配置设置。在发送GET 请求歌曲/艺术​​家数据时,我能够解决 CORS 访问问题。根据他们的开发网站,这是 Spotify 网络身份验证流程的一部分,这里的一名员工说应该使用POST,所以它应该在技术上是可能的...... 通过在客户端执行此操作,您将在 HTTP 之上涉及same origin policy,从而创建了 CORS 的要求。 Spotify 可以选择是否在各个路径上启用 CORS,而且他们似乎选择不为 /api/token 启用 CORS。因此,实现它的方法很可能是:不要尝试使用 Ajax 严格地在客户端执行它。在您的服务器中使用http.request() 发出实际请求。 【参考方案1】:

您可以在https://github.com/spotify/web-api-auth-examples 上找到使用 express 执行 Spotify 身份验证流程的示例(请参阅authorization_code 方法)。

您无法获得向/api/token 发出客户端请求的访问令牌。您需要向/authorize 发出请求,该请求将重定向到您的redirect_uri,它本身将使用访问令牌交换code

检查该示例,它应该满足您的需求。

【讨论】:

以上是关于允许前端 JavaScript POST 请求到 https://accounts.spotify.com/api/token 端点的主要内容,如果未能解决你的问题,请参考以下文章

前端面试:基础javascript篇

前端面试的面试经验

php获取post数据

前端Jquery-Ajax跨域请求,并携带cookie

无法从前端 JavaScript 访问跨域响应标头

Javascript/AJAX POST 多部分/表单数据