启用 CORS 不适用于 Spotify Web API [重复]

Posted

技术标签:

【中文标题】启用 CORS 不适用于 Spotify Web API [重复]【英文标题】:Enabling CORS not working with Spotify Web API [duplicate] 【发布时间】:2019-10-22 15:30:31 【问题描述】:

我正在构建一个使用 Spotify Web API 的 Express 应用程序,并且我使用 ejs 作为我的视图引擎。我有一个 ejs 页面,您可以在其中单击一个按钮,然后它会调用我的 Express 服务器中的一个端点,该端点使用 res.redirect() 重定向几次(在同一服务器内),然后最终登陆一个像这样调用 https://accounts.spotify.com/authorize 的端点

res.redirect('https://accounts.spotify.com/authorize' +
      '?response_type=code' +
      '&client_id=' + process.env.SPOTIFY_CLIENT_ID +
      (scopes ? '&scope=' + encodeURIComponent(scopes) : '') +
      '&redirect_uri=' + encodeURIComponent(process.env.SPOTIFY_REDIRECT_URI))

但是,在我的浏览器的检查窗口中,这是我得到的错误:

Access to XMLHttpRequest at 'https://accounts.spotify.com/authorize?my params here' (redirected from 'http://localhost:5000/login') from origin 'http://localhost:5000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

当我从我的 ejs 页面进行原始调用时,我使用 XMLHttpRequest 库并像这样发出请求:

xhttp.open("POST", "http://localhost:5000/login", true)
xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
xhttp.setRequestHeader('Access-Control-Allow-Origin', '*')
xhttp.setRequestHeader('Access-Control-Allow-Method', 'GET, POST, PATCH, PUT, DELETE, OPTIONS')
xhttp.setRequestHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token')
xhttp.send(`email=$email&password=$password`)

我还在我的服务器端代码上使用 CORS 包,如下所示:

app.use(cors())

我需要在其他地方启用 CORS,还是我完全缺少其他东西?

【问题讨论】:

【参考方案1】:

1) 从客户端(ejs 页面)拨打电话时,您不必发送 Access-Control-* 标头。

2) 服务器需要使用 Access-Control-* 标头进行响应以允许 CORS。服务器还需要先处理“OPTIONS”请求。通常,我不使用这样的 cors 中间件来执行此操作:

// Enabling CORS
app.use((req, res, next) => 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "*");

  if (req.method === "OPTIONS") 
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH");
    return res.status(200).json();
  
  next();
);

使用 * 不是一个好习惯,并且在浏览器需要接受 cookie 的情况下是不允许的。但是您现在可以使用它来测试您的 api。

以上也可以使用cors中间件来实现。 下面一行:

app.use(cors())

在请求发送到任何路由/控制器之前应该只添加一次。 这可确保为每个响应实际添加允许 CORS 所需的标头。

更新: 如果你想从浏览器访问 spotify 页面,它应该从你的客户端(ejs 页面)重定向。从您的服务器获取必要的数据并使用它从您的客户端重定向。

【讨论】:

是的,我把它放在每条路线之前 更新了答案。你能检查一下服务器的响应,看看它是否包含 Access-Control-Allow-Origin 标头吗? 所以你是说我应该做这两个选项中的一个而不是两个? 是的。两种选择中的任何一种。两者都不是。 尝试使用邮递员进行 api 调用并检查您的服务器是否返回 Access-Control-* 标头。

以上是关于启用 CORS 不适用于 Spotify Web API [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Web Api 2 CORS 不适用于 POST

Spotify web api 不适用于 ios 设备

Spotify Web API 不适用于特定用户?

Cors 不适用于删除和放入 web api2

.NET Web API CORS 不适用于所有路由

CORS 不适用于 ASP NET 5 Web Api