Проверка подлинности узла и паспорта, зависание запроса от клиента к серверу - PullRequest
0 голосов
/ 28 апреля 2020

Я только что включил паспорт js в мой проект для аутентификации. Но теперь мои POST запросы на создание нового пользователя зависают и возвращают клиенту предупреждение «Не авторизовано» после закрытия сервера. Мой старый код (без паспорта) все еще работает, поэтому я не думаю, что это проблема с прокси-сервером от клиента к серверу

Последний консольный журнал , который я вижу, является первым журналом в пользовательском API, console.log('received request ', req.body)

Нет зарегистрированных сообщений об ошибках, кроме случаев, когда я остановлю сервер, я получу

"Proxy error: Could not proxy request /api/user from localhost:3000 to http://localhost:5000/. [1] See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).

///app.js (server)

const express = require("express");
const bodyParser = require("body-parser");
const cors = require('cors');
const mongoose = require("mongoose");
const routes = require("./routes"); //Used to end with /api
const path = require("path");
require("dotenv").config();

const passport = require('passport');

const app = express();

const port = process.env.PORT || 5000;

//database
mongoose
  .connect(process.env.DB, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log("Database connected successfully"))
  .catch((err) => console.log(err));

mongoose.Promise = global.Promise;

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

require('./config/passport');

app.use(cors());
app.use(bodyParser.json());
app.use(passport.initialize());

app.use("/", routes); //Load API - this folder has an index.js file

app.use((err, req, res, next) => {
  console.log("$!$", err);
  next();
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

///users.js (API for User model)

const passport = require('passport');
const express = require("express");
const router = express.Router();
const User = require("../models/User");

//Old - This works, which makes me think the issue is with Passport js
// router.post("/user", (req, res, next) => {
//   try {
//     User.create(req.body)
//       .then((data) => res.json(data))
//       .catch(next);
//   } catch {
//     res.json({
//       error: "Failed to upload new user",
//     });
//   }
// });
//New
router.post("/user", (req, res, next) => {
  console.log('received request ', req.body);
  passport.authenticate('register', (err, hashedPassword, info) => {
    if (err) {
      console.log("Passport err on register ", err);
    }
    else if (info != undefined) {
      console.log("Defined err ", info.message);
      res.send(info.message);
    } else {
      req.login(user, err => {
        const newUser = {
          firstName: req.body.firstName,
          lastName: req.body.lastName,
          email: req.body.email,
          password: hashedPassword,
        };
        User.create(newUser)
          .then((data) => res.json(data))
          .catch(next);
      });
    }
  });
});
//passport.js (for auth)

const bcrypt = require('bcrypt');

const BCRYPT_SALT_ROUNDS = 12;

const passport = require('passport'),
      localStrategy = require('passport-local').Strategy,
      User = require('../models/User'),
      JWTstrategy = require('passport-jwt').Strategy,
      ExtractJWT = require('passport-jwt').ExtractJwt;

const opts = {
  jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('JWT'),
  secretOrKey: 'secret key',
};

passport.use(
  'register',
  new localStrategy(
    {
      usernameField: 'email',
      passwordField: 'password',
    },
    (email, password, done) => {
      try {
        console.log('searching for User');
        User.findOne({ email })
          .then(user => {
          if (user != null) {
            console.log('email already taken');
            return done(null, false, { message: 'email already in use' });
          } else {
            console.log('email is available');
            bcrypt.hash(password, BCRYPT_SALT_ROUNDS).then(hashedPassword => {
              console.log('hashed password created for new user');
              return done(null, hashedPassword, null);
            });
          }
        })
      } catch(err) {
        done(err);
      }
    }
  )
)

1 Ответ

1 голос
/ 28 апреля 2020

passport.authenticate в вашем коде не используется как связующее ПО , но как обычная функция с именем внутри обработчика запросов. Начиная с паспортной документации вы должны вызывать функцию возврата при использовании таким образом, например:

  passport.authenticate('register', (err, hashedPassword, info) => {
     // ...
  })(req, res, next); // <- ADD ARGUMENTS AND CALL
...