首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spotify节点web api -登录后立即退出

Spotify节点web api -登录后立即退出
EN

Stack Overflow用户
提问于 2022-01-14 13:36:14
回答 2查看 106关注 0票数 1

我试图使用Client(React)和Server进行Spotify身份验证,登录工作一秒钟,然后页面在登录后立即刷新,并将用户注销。有人知道问题出在哪里吗?

这是我的代码:

server.js:

代码语言:javascript
运行
复制
require('dotenv').config();
const express = require('express');
const cors = require('cors');
const SpotifyWebApi = require('spotify-web-api-node');


const app = express();

app.use(cors()) // to handle the cross-origin requests
app.use(express.json()); // to parse JSON bodies

const port = process.env.PORT || 8000;

const credentials = {
  clientId: process.env.CLIENT_ID,
  clientSecret: process.env.CLIENT_SECRET,
  redirectUri: process.env.REDIRECT_URI || "http://localhost:3000"
};

app.post('/refresh', (req, res) => {
  const refreshToken = req.body.refreshToken;
  // console.log("Hii");
  let spotifyApi = new spotifyWebApi({
    clientId: process.env.CLIENT_ID,
    clientSecret: process.env.CLIENT_SECRET,
    redirectUri: process.env.REDIRECT_URI,
    refreshToken,
  });

  spotifyApi
    .refreshAccessToken()
    .then((data) => {
      // console.log(data.body);
      res.json({
          accessToken: data.body.access_token,
          expiresIn: data.body.expires_in,
      })

    })
    .catch((err) => {
      console.log(err);
      res.sendStatus(400);
    });
});


app.post('/login', (req,res) => {
  // Get the "code" value posted from the client-side and get the user data from the spotify api 
  let spotifyApi = new spotifyWebApi(credentials)
  const code = req.body.code

  spotifyApi.authorizationCodeGrant(code).then((data) => {

      // Returning the User's Data in the json formate  
      res.json({
          accessToken : data.body.access_token,
          refreshToken : data.body.refresh_token,
          expiresIn : data.body.expires_in
      }) 
  })
  .catch((err) => {
      console.log(err);
      res.sendStatus(400)
  })

})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

客户端: useAuth.js:

代码语言:javascript
运行
复制
import React from 'react';
import { useEffect, useState } from 'react';
import axios from "axios"


export default function useAuth(code) {
    const [accessToken, setAccessToken] = useState();
    const [refreshToken, setRefreshToken] = useState();
    const [expiresIn, setExpiresIn] = useState();

    useEffect(() => {
        
        axios
            .post("/login", {code})
            .then((res) => {

                window.history.pushState({}, null, "/");

                console.log(res.data);
                setAccessToken(res.data.accessToken);
                setRefreshToken(res.data.refreshToken);
                setExpiresIn(res.data.expiresIn);
            })
            .catch(() => {
                window.location = "/";
            });

    }, [code]);

    useEffect(() => {
        if (!refreshToken || !expiresIn) {
            return;
        }

        let interval = setInterval(() => {
            axios
                .post("/refresh", {refreshToken})
                .then((res) => {
                    setAccessToken(res.data.accessToken);
                    setExpiresIn(res.data.expiresIn);
                })
                .catch(() => {
                    window.location = "/";
                });
        }, (expiresIn - 60) * 1000);

        return () => clearInterval(interval)
    }, [refreshToken, expiresIn]);

    return accessToken;
}

spotifyConfig.js:

代码语言:javascript
运行
复制
const authEndpoint = "https://accounts.spotify.com/authorize";
const redirectUri = "http://localhost:3000";
const clientId = "ea28d4ba34f34b44b59c640052c6e098";

const scopes = [
  "streaming",
  "playlist-modify-public",
  "ugc-image-upload",
  "user-read-email",
  "user-read-private",
  "user-read-currently-playing",
  "user-read-recently-played",
  "user-read-playback-state",
  "user-modify-playback-state"
];

export const loginUrl = `${authEndpoint}?client_id=${clientId}&response_type=code&redirect_uri=${redirectUri}&scope=${scopes.join(
  "%20"
)}&show_dialog=true`;

App.js:

代码语言:javascript
运行
复制
import './App.css';
import Dashboard from './pages/Dashboard';
import Login from './components/Login';


const code = new URLSearchParams(window.location.search).get('code')
function App() {
  
  return (
    <div>
    {code ? <Dashboard code={code}/> : <Login/>}
    
    </div>
  );
}

export default App;

此页面将出现第二次,然后注销Dashboard.js:

代码语言:javascript
运行
复制
import React, {useEffect} from 'react';
import useAuth from '../useAuth';
import SpotifyWebApi from "spotify-web-api-node";


const spotifyApi = new SpotifyWebApi({
    clientId: "ea28d4ba34f34b44b59c640052c6e098",
});

export default function Dashboard({code}) {
    const accessToken = useAuth(code);

    useEffect(() => {
        
        if (!accessToken) return;

        spotifyApi.setAccessToken(accessToken);

        spotifyApi.getMe().then(data => {
            console.log(data);
        })
    }, []);

    return (
        <div>
            This is the home page 
        </div>
    )
}

Login.js:

代码语言:javascript
运行
复制
import React from 'react';
import { loginUrl } from '../spotifyConfig';

export default function Login() {
    
    return (
        <div>
            <a href={loginUrl}>
                <button>LOGIN WITH SPOTIFY</button>
            </a>

            <div className="links">
                <p>
                    ⚠ When joining or creating a Queue, open Spotify to be able to queue up tracks
                </p>
            </div>
        </div>
    )
}
EN

回答 2

Stack Overflow用户

发布于 2022-06-19 11:23:53

我也经历过类似的问题。以下是帮助我解决这一问题的几个步骤,以及我随后遇到的许多问题。

  1. 运行IDE的调试器并为/login请求设置断点。另外,检查您的环境变量是否按照您的意愿设置(如果运行VSCode,您可以学习如何设置这里)。特别是,确保您的凭据clientId: process.env.CLIENT_ID, clientSecret: process.env.CLIENT_SECRET, redirectUri: process.env.REDIRECT_URI是正确的。如果您的环境变量没有加载,您将无法创建一个新的SpotifyWebApi实例(请查看dotenv文件没有加载环境变量。)。检查这是否是问题的另一个简单方法是临时对您的值进行硬编码。
  2. 在运行客户端之前,独立测试服务器/login端点,以查看端点在执行对Spotify的请求时是否返回了400或另一个错误。
  3. 确保在浏览器中保持devtools控制台处于打开状态,这样您就可以识别向Spotify API发出的任何失败请求,并考虑设置devtools以保存日志,以防页面刷新删除日志。
  1. 如果您同时在VSCode内部运行客户端和服务器,请尝试在VSCode之外的新shell中运行它们。
票数 0
EN

Stack Overflow用户

发布于 2022-08-10 06:41:03

我有一个类似的问题,遵循了教程,然后是本YouTube教程

我意识到,我的App组件被呈现了两次,这导致了所有的东西都被调用了两次,包括登录端点。我能够在端点中使用console.log验证这一点,并查看日志是否出现了两次。由于在SpotifyWebApi.authorizationCodeGrant中使用相同的Spotify代码两次,这就是导致错误的原因。

我能够将问题跟踪到启用的React.StrictMode,这肯定是在使用create-react-app命令时发生的。验证标签是否出现在您的index.js文件中。有关更多信息,请查看此StackOverflow答案:由于严格模式,我的React组件正在渲染两次

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70711404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档