Извлечение API-оболочки Spotify в собственный класс - PullRequest
0 голосов
/ 18 ноября 2018

Я создаю небольшое приложение с 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');
        });
    }
  }

Что я пытаюсь сделать:

  1. Создание экземпляра spotifyNodeWrap из пакета spotify с моим клиентским идентификатороми Secret.

  2. Создайте URL-адрес авторизации из конечной точки /authorize, которую предоставляет Spotify, и перенаправьте туда пользователя.

  3. Как только пользователь дает разрешения, пользователь будет перенаправлен на redirectURI с кодом авторизации в параметрах code, который можно обменять на токен доступа.

Я запутался в своей функции callback. Могу ли я создать там новый экземпляр spotifyNodeWrap?Мне нужна та же самая оболочка, которая была создана с самого начала и добавлена ​​в другие функции.Должен ли я установить его как часть конструктора?

...