【问题标题】:CORS error when sending a request from my reactjs app to my express server, which redirects to Spotify's API [duplicate]从我的 reactjs 应用程序向我的快递服务器发送请求时出现 CORS 错误,该服务器重定向到 Spotify 的 API [重复]
【发布时间】:2021-06-17 22:02:45
【问题描述】:

通过我的 react 应用程序的任何其他请求似乎都可以正常工作,直到我尝试将 res.redirect 发送到其他地方。 我有点理解为什么它不起作用,但我不知道如何正确实现类似的东西。 参考代码:

反应 app.js:

  function loginToSpotify() {
    axios.get('http://localhost:4000/login')
    .then(res => {
      console.log(res)
    })
    .catch(err => {
      console.log("error!")
    })
  }

表达 server.js:

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var cors = require('cors');


var app = express();

app.use(cors())
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

module.exports = app;

表示 index.js 登录调用:

const { default: axios } = require('axios');
var express = require('express');
var router = express.Router();
var querystring = require('querystring')
var  SpotifyWebApi = require('spotify-web-api-node');
/* GET home page. */

let spotifyApi = new SpotifyWebApi({
    clientId:'c2b60e83cbdb4b5ba923140f0c32ac8f',
    clientSecret:'d45b554801ab4333b89a36bdbf04fad7'
})

let clientId = 'c2b60e83cbdb4b5ba923140f0c32ac8f'
let clientSecret = 'd45b554801ab4333b89a36bdbf04fad7'
let scopes = 'user-read-playback-state user-read-currently-playing'
let redirectUri = 'http://localhost:4000/token'


router.get('/login', (req, res) => {
  res.redirect('https://accounts.spotify.com/authorize' + '?response_type=code&client_id=' + clientId + '&scope=' + encodeURIComponent(scopes) + '&redirect_uri=' + encodeURIComponent(redirectUri))
})

它甚至永远不会被重定向回来,它每次都会抛出这个错误:

Access to XMLHttpRequest at 'https://accounts.spotify.com/authorize?response_type=code&client_id=<removed by me just in case>&scope=user-read-playback-state%20user-read-currently-playing&redirect_uri=http%3A%2F%2Flocalhost%3A3000' (redirected from 'http://localhost:4000/login') from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我认为如果我从我的 react 应用程序调用我的服务器,然后我的服务器重定向到 spotify 的 api 会很好,但它仍然给我这个错误。

还要注意,如果我从浏览器访问服务器的登录页面,它会起作用,但它不喜欢我猜的“两次跳转”

我已经看到了这个帖子,但仍然有点困惑: Access-Control-Allow-Origin denied spotify api 如果我从我的客户端调用我的服务器,然后服务器调用令牌,它不应该工作吗?

如何正确实现登录?

【问题讨论】:

  • 您是否尝试过将 cors 选项传递给 cors 参数?
  • 我没有,但其他所有请求似乎都在预期中工作,所以我怀疑它与此有关。不过我会试试的!
  • 是的,这可能会有所帮助(y)

标签: node.js reactjs axios cors


【解决方案1】:

避免 CORS 问题的第一步是确保您在 Spotify 上的网站是“localhost:4000”。

重定向最有可能引起关注。您不想使用重定向。您希望 Spotify 对用户进行身份验证,然后使用令牌将他们重定向回您的网站。

我建议使用passportJS,如果您不熟悉处理令牌等,这是一种更安全的方式。

制定这样的策略

const passport = require('passport');
const SpotifyStrategy = require('passport-spotify').Strategy;
passport.serializeUser(function(user, done) {
  done(null, user);
});
passport.deserializeUser(function(user, done) {
  done(null, user);
});
passport.use(new SpotifyStrategy({
  clientID: "c2b60e83cbdb4b5ba923140f0c32ac8f",
  clientSecret: "d45b554801ab4333b89a36bdbf04fad7",
  callbackURL: "http://localhost:4000/auth/spotify/callback"
},
function(accessToken, refreshToken, profile, done) {
  return done(null, profile);
}
));

PassportJS Spotify Docs

const passport = require('passport');
require('./passport')

app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/spotify',passport.authenticate('spotify'));
app.get('/auth/spotify/callback',passport.authenticate('spotify', { failureRedirect: '/auth/error' }),
function(req, res) {
  res.redirect('/');
});
app.get('/logout', (req, res) => {
  req.session = null;
  req.logout(); 
  res.redirect('/');
})

【讨论】:

  • 嘿@Dallas Baker,感谢您的意见!我会看一下 PassportJS,它看起来确实更干净。您是否解释了为什么我当前的代码不起作用?我也想了解我的错误。
  • @SkyNess 是的,因此您正在尝试从服务器重定向用户。您需要从客户端重定向它们。一旦他们在他们这边进行验证,他们将使用代码重定向到您的网站。在服务器端,您希望获取该代码并将其传递给 Spotify。作为回报,他们会给你一个访问令牌。滚动浏览他们最初显示的样板代码。转到身份验证流程并从第 1 部分开始。让您的应用程序请求授权;用户登录并授权访问 DOCS
  • 哦,所以我宁愿从客户端发送 /login 请求并将其重定向回客户端,然后获取代码并向我的服务器发送一个 post 请求,其中包含检索令牌的代码?
  • 正确,这是推荐的方法。
猜你喜欢
  • 2023-02-10
  • 2016-05-15
  • 2017-01-28
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多