Я создаю небольшое приложение с Node, используя Express и Spotify Web API Я создал маршруты для файла server.js
, чтобы проверить логику, и теперь я пытаюсь извлечь логику дляАвторизация Перейдите в класс SpotifyClient
, который я добавлю в свой класс Server
(еще не готов).Вот что у меня есть:
const Spotify = require('spotify-web-api-node');
class SpotifyClient {
constructor() {
this.SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID;
this.SPOTIFY_SECRET_ID = process.env.SPOTIFY_SECRET_ID;
this.SPOTIFY_TOKEN = '';
this.REDIRECT_URI = 'http://localhost:4000/callback';
this.STATE_KEY = 'spotify_auth_state';
}
spotifyNodeWrap() {
const options = {
id: this.SPOTIFY_CLIENT_ID,
secret: this.SPOTIFY_SECRET_ID,
redirectUri: this.REDIRECT_URI
};
const spotifyApi = new Spotify(options);
return spotifyApi;
}
spotifyAuth(req, res) {
const scopes = [
'user-read-private',
'user-read-email',
'playlist-read-private',
'playlist-modify-private',
'playlist-modify-public'
];
// generate random string to be used as state
const generateRandomString = N =>
(Math.random().toString(36) + Array(N).join('0')).slice(2, N + 2);
const state = generateRandomString(16);
const spotifyApi = this.spotifyNodeWrap();
const authURL = spotifyApi.createAuthorizeURL(scopes, state);
res.redirect(authURL);
}
// Logic to create authroization is here:
callback(req, res) {
const { code, state } = req.query;
const storedState = req.cookies ? req.cookies[this.STATE_KEY] : null;
let SPOTIFY_ID = '';
let SPOTIFY_TOKEN = '';
if (state === null || state !== storedState) {
res.redirect('/#/error/state mismatch');
} else {
res.clearCookie(this.STATE_KEY);
this.spotifyApi
.authorizationCodeGrant(code)
.then(data => {
const expiresIn = data.body.expires_in;
const accessToken = data.body.access_token;
const refreshToken = data.body.refresh_token;
// Set the access token on the API object to use it in later calls
SPOTIFY_TOKEN = accessToken;
spotifyApi.setAccessToken(accessToken);
spotifyApi.setRefreshToken(refreshToken);
spotifyApi.getMe().then(({ body }) => {
SPOTIFY_ID = body.id;
});
res.redirect('/search');
})
.catch(err => {
res.redirect('/#/error/invalid token');
});
}
}
Что я пытаюсь сделать:
Создание экземпляра spotifyNodeWrap
из пакета spotify с моим клиентским идентификатороми Secret.
Создайте URL-адрес авторизации из конечной точки /authorize
, которую предоставляет Spotify, и перенаправьте туда пользователя.
Как только пользователь дает разрешения, пользователь будет перенаправлен на redirectURI
с кодом авторизации в параметрах code
, который можно обменять на токен доступа.
Я запутался в своей функции callback
. Могу ли я создать там новый экземпляр spotifyNodeWrap
?Мне нужна та же самая оболочка, которая была создана с самого начала и добавлена в другие функции.Должен ли я установить его как часть конструктора?