Проверить пользователя на аутентификацию с помощью пакета Node.JS Passport и перенаправить на логин, если не аутентифицирован? - PullRequest
0 голосов
/ 11 февраля 2019

Я использую пример кода, показанный внизу этого поста в моем приложении Node.JS, для выполнения входа и аутентификации на основе Twitch OAuth:

https://github.com/twitchdev/authentication-samples/blob/master/node/index.js

Вход в систему работает без ошибок.Когда я захожу на страницу, я получаю кнопку «Connect with Twitch».Если я не вошел в систему, я получаю диалоговое окно авторизации Twitch и затем перенаправляюсь на свой URL обратного вызова.Если я вошел в систему, он успешно перенаправляет на мой URL-адрес обратного вызова для успешной аутентификации, не показывая мне диалоговое окно аутентификации Twitch.

Теперь мне нужен быстрый способ проверить, прошла ли аутентификация пользователя.Я нашел этот пост с ответом, в котором показано использование функции req.isAuthenticated () :

https://stackoverflow.com/questions/45093725/redirecting-to-previous-page-after-authentication-using-node-js-and-passport

Но эта функция всегда возвращает мне FALSE, даже если пользователь аутентифицирован.Какой код я могу использовать, чтобы быстро проверить, был ли пользователь аутентифицирован или нет с помощью Twitch?

Кроме того, если бы кто-то мог показать мне, как расширить проверку аутентификации с одной страницы до всех или группы моего узла.JS / Страницы приложения Express Я был бы признателен за это.

// -------------------- BEGIN: Twitch Authentication (OAuth) ------------

  // The code in this section is courtesy of Amazon, licensed under the Apache 2.0 license:
  //
  //  https://github.com/twitchdev/authentication-samples/blob/master/node/index.js

  var session        = require('express-session');
  var passport       = require('passport');
  var OAuth2Strategy = require('passport-oauth').OAuth2Strategy;
  var request        = require('request');
  var handlebars     = require('handlebars');

  // Initialize Express and middlewares

  app.use(session({secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false}));
  app.use(express.static('public'));
  app.use(passport.initialize());
  app.use(passport.session());

  // Override passport profile function to get user profile from Twitch API
  OAuth2Strategy.prototype.userProfile = function(accessToken, done) {
    var options = {
      url: 'https://api.twitch.tv/helix/users',
      method: 'GET',
      headers: {
        'Client-ID': process.env.TWITCH_CLIENT_ID,
        'Accept': 'application/vnd.twitchtv.v5+json',
        'Authorization': 'Bearer ' + accessToken
      }
    };

    request(options, function (error, response, body) {
      if (response && response.statusCode == 200) {
        done(null, JSON.parse(body));
      } else {
        done(JSON.parse(body));
      }
    });
  }

  passport.serializeUser(function(user, done) {
      done(null, user);
  });

  passport.deserializeUser(function(user, done) {
      done(null, user);
  });

  passport.use('twitch', new OAuth2Strategy({
      authorizationURL: 'https://id.twitch.tv/oauth2/authorize',
      tokenURL: 'https://id.twitch.tv/oauth2/token',
      clientID: process.env.TWITCH_CLIENT_ID,
      clientSecret: process.env.TWITCH_SECRET,
      callbackURL: process.env.CALLBACK_URL,
      state: true
    },
    function(accessToken, refreshToken, profile, done) {
      profile.accessToken = accessToken;
      profile.refreshToken = refreshToken;

      // Securely store user profile in your DB
      //User.findOrCreate(..., function(err, user) {
      //  done(err, user);
      //});

      done(null, profile);
    }
  ));

  // Set route to start OAuth link, this is where you define scopes to request
  app.get('/auth/twitch', passport.authenticate('twitch', { scope: 'user_read' }));

  // Set route for OAuth redirect
  app.get('/auth/twitch/callback', passport.authenticate('twitch', { successRedirect: '/', failureRedirect: '/' }));

  // Define a simple template to safely generate HTML with values from user's profile
  var template = handlebars.compile(`
  <html><head><title>Twitch Auth Sample</title></head>
  <table>
      <tr><th>Access Token</th><td>{{accessToken}}</td></tr>
      <tr><th>Refresh Token</th><td>{{refreshToken}}</td></tr>
      <tr><th>Display Name</th><td>{{display_name}}</td></tr>
      <tr><th>Bio</th><td>{{bio}}</td></tr>
      <tr><th>Image</th><td>{{logo}}</td></tr>
  </table></html>`);

  // If user has an authenticated session, display it, otherwise display link to authenticate
  // ROS: Access to page protected by Twitch login.
  app.get('/test-twitch-login', function (req, res) {
    if(req.session && req.session.passport && req.session.passport.user) {
      res.send(template(req.session.passport.user));
    } else {
      res.send('<html><head><title>Twitch Auth Sample</title></head><a href="/auth/twitch"><img src="http://ttv-api.s3.amazonaws.com/assets/connect_dark.png"></a></html>');
    }
  });

  /*
  app.listen(3000, function () {
    console.log('Twitch auth sample listening on port 3000!')
  });
  */

  // -------------------- END  : Twitch Authentication (OAuth) ------------
...