Spotify API Authorization перенаправляет слишком много раз - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать Spotify API и следую их инструкциям по авторизации, найденным здесь: https://github.com/spotify/web-api-auth-examples/blob/master/authorization_code/app.js.

Их версия кода авторизации напрямую использует маршруты в коде сервера, но я хотел разделить авторизацию на ее собственный маршрут. Вот моя версия кода:

const authRouter = require("express").Router();
const config = require("../utils/config");
const request = require("request");
const querystring = require("querystring");

// Spotify client configurations
const client_id = config.CLIENT_ID;
const client_secret = config.CLIENT_SECRET;
const redirect_uri = config.REDIRECT_URI;
const stateKey = "spotify_auth_state";

//...

// @route   GET /
// @desc    Prompt User to Login into Spotify
authRouter.get("/", async (req, res) => {
  try {
    var state = generateRandomString(16);
    res.cookie(stateKey, state);

    // Request for user full name, profile image, and email address.
    var scope = "user-read-private user-read-email";

    // 1. Get the user's authorization to access data.
    res.redirect(
      "https://accounts.spotify.com/authorize?" +
        querystring.stringify({
          response_type: "code",
          client_id: client_id,
          scope: scope,
          redirect_uri: redirect_uri,
          state: state,
        })
    );
  } catch {
    console.log("error.");
  }
});

// @route   GET /callback
// @desc    Spotify callback to request access and refresh tokens
authRouter.get("/callback", async (req, res) => {
  try {
    var code = req.query.code || null; // The authorization code returned by the first call.
    var state = req.query.state || null;
    var storedState = req.cookies ? req.cookies[stateKey] : null;

    // Check the state parameter
    if (state === null || state !== storedState) {
      res.redirect(
        "/#" +
          querystring.stringify({
            error: "state_mismatch",
          })
      );
    } else {
      res.clearCookie(stateKey);
      const authOptions = getAuthOptions(
        code,
        redirect_uri,
        client_id,
        client_secret
      );
      // 2. Request an access token and refresh token
      request.post(authOptions, function (error, response, body) {
        if (!error && response.statusCode === 200) {
          // Authorize successful. Access and Refresh Tokens granted.
          var access_token = body.access_token,
            refresh_token = body.refresh_token;

          // Send the tokens to the client so the client can use them in requests to the Spotify API.
          res.redirect(
            "/#" +
              querystring.stringify({
                access_token: access_token,
                refresh_token: refresh_token,
              })
          );
        } else {
          res.redirect(
            "/#" +
              querystring.stringify({
                error: "invalid_token",
              })
          );
        }
      });
    }
  } catch {
    console.log("error.");
  }
});

module.exports = authRouter;

И в моем приложении. js:

const express = require("express");
const authRouter = require("./controllers/auth");
const cors = require("cors");
var cookieParser = require("cookie-parser");

// initialize app with Express to create client to communicate with Spotify
const app = express();

app.use(cors());
app.use(cookieParser());
app.use("/", authRouter);

module.exports = app;

Теперь, когда я запускаю свой сервер, мой браузер возвращает: "account.spotify .com перенаправил вас слишком много раз. Когда я попытался запустить свой сервер в режиме инкогнито, появляется приглашение входа в Spotify. После того, как я ввел свои учетные данные, он возвращает: «account.spotify.com перенаправлял вас слишком много раз».

Я пытался очистить свои куки и кеши, но это не работает.

Кроме того, я подтвердил, что мой URI перенаправления для моего сервера совпадает с моим URI перенаправления в настройках приложения Spotify.

В чем могут быть причины, по которым аутентификация, похоже, застревает в бесконечный l oop?

1 Ответ

0 голосов
/ 16 апреля 2020

Причина бесконечного l oop заключается в том, что код отправляет клиенту токены доступа и refre sh:

          // Send the tokens to the client so the client can use them in requests to the Spotify API.
          res.redirect(
            "/#" +
              querystring.stringify({
                access_token: access_token,
                refresh_token: refresh_token,
              })
          );

Поскольку я определил следующий маршрут:

authRouter.get("/", async (req, res) => {

Токены доступа и refre sh перенаправляются на страницу входа, что затем приводит к обратному вызову, который снова перенаправляет на вход в систему, создавая бесконечное l oop.

Как я Решено это было перенаправить доступ и переопределить токены sh в другой компонент, а не только в "/#" + query.string..., как указано в примере кода Spotify.

Пример кода Spotify не приводит к бесконечному l oop поскольку они определили маршрут /login для страницы входа в систему, но я выбрал root моего сайта в качестве страницы входа, поскольку в моем случае проверка подлинности должна быть первым шагом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...