Spotify Web API 返回“客户端范围不足”。尽管客户范围很广

问题描述 投票:0回答:1

我编写了一个程序,旨在将歌曲添加到我自己的 Spotify 播放列表中。

以下是授权码:

const { SpotifyWebApi } = require('spotify-web-api-node');

module.exports = async (req, res) => {
  const spotifyApi = new SpotifyWebApi({
    clientId: process.env.SPOTIFY_CLIENT_ID,
    clientSecret: process.env.SPOTIFY_CLIENT_SECRET,
    redirectUri: `${process.env.VERCEL_URL}/api/callback`,
  });

  const scopes = ['playlist-read-private', 'playlist-read-collaborative', 'playlist-modify-public', 'playlist-modify-private', 'user-read-playback-state', 'user-modify-playback-state', 'user-read-currently-playing', 'playlist-read-collaborative', 'user-read-playback-position', 'user-library-modify'];
  const authorizeURL = spotifyApi.createAuthorizeURL(scopes, null);
  res.writeHead(302, { Location: authorizeURL });
  res.end();
};

虽然您认为我只需要播放列表修改公共和私人,但我在测试后将它们全部包含在内。 /callback 函数返回我在代码中包含的刷新令牌。

然而,当我尝试

await spotifyApi.addTracksToPlaylist(playlistId, [`spotify:track:${songId}`]);
时,我收到以下错误:
"An error occurred while communicating with Spotify's Web API.\nDetails: Insufficient client scope."

我不明白如何获得不正确的客户端范围?我已经确保令牌是正确的。我不知道该怎么办。

javascript node.js spotify vercel
1个回答
0
投票

spotify-web-api-node
不完全支持
Authorization Code Flow

这意味着你需要通过express提供一个回调端点作为本地服务器。

并请求

code
并兑换成
access token

本教程代码是来自

spotify-web-api-node

的最佳示例
https://github.com/thelinmichael/spotify-web-api-node/blob/master/examples/tutorial/00-get-access-token.js

演示代码

用于将歌曲添加到您的播放列表中

另存为

demo.js

const express = require('express');
const SpotifyWebApi = require('spotify-web-api-node');

const PORT = 3000;  // it need to match your REDIRECT URI's port
const CLIENT_ID = '<your client id>'
const CLIENT_SECRET = '<your client secret>'
const PLAYLIST_ID = '<your playlist id>'
const scopes = [
    'playlist-modify-public',
    'playlist-modify-private'
];

const spotifyApi = new SpotifyWebApi({
    redirectUri: `http://localhost:${PORT}/callback`,
    clientId: CLIENT_ID,
    clientSecret: CLIENT_SECRET
});

const app = express();

app.get('/login', (req, res) => {
    res.redirect(spotifyApi.createAuthorizeURL(scopes));
});

app.get('/callback', (req, res) => {
    const error = req.query.error;
    const code = req.query.code;
    const state = req.query.state;

    if (error) {
        console.error('Callback Error:', error);
        res.send(`Callback Error: ${error}`);
        return;
    }

    spotifyApi
        .authorizationCodeGrant(code)
        .then(data => {
            const access_token = data.body['access_token'];
            const refresh_token = data.body['refresh_token'];
            const expires_in = data.body['expires_in'];

            spotifyApi.setAccessToken(access_token);
            spotifyApi.setRefreshToken(refresh_token);

            spotifyApi.addTracksToPlaylist(PLAYLIST_ID, [
                'spotify:track:4iV5W9uYEdYUVa79Axb7Rh'  // Prelude for Piano No. 11 in F-Sharp Minor
            ])
            res.send('Success! You added a song into your playlist');

            setInterval(async () => {
                const data = await spotifyApi.refreshAccessToken();
                const access_token = data.body['access_token'];
                spotifyApi.setAccessToken(access_token);
            }, expires_in / 2 * 1000);
        })
        .catch(error => {
            console.error('Error getting Tokens:', error);
            res.send(`Error getting Tokens: ${error}`);
        });
});

app.listen(PORT, () =>
    console.log(
        `HTTP Server up. Now go to http://localhost:${PORT}/login in your browser.`
    )
);

如何获取您的配置

https://developer.spotify.com/dashboard

安装依赖项

npm install express spotify-web-api-node

运行它

node demo.js

浏览器登录

http://localhost:3000/login

端口号再次需要与您的配置相匹配。

结果

Next.js 的类似实现

在 NextJS 中获取 Spotify Oauth 但不起作用

© www.soinside.com 2019 - 2024. All rights reserved.