尝试将护照与 NodeJS 和角度一起使用,但我的代码不会超过这一点

问题描述 投票:0回答:1

我正在学习教程并尝试使用护照登录,但使用我的代码。但是在尝试登录时,我的表单,即我按下按钮时的 UI 没有做任何事情,它没有被重定向到我的主页,它只是保持原样。我将按顺序从前到后发布代码。 Passport 配置是我目前遇到问题的地方,我尝试了一切,我没有想法,有些地方不对,我在网上找不到太多,因为没有实际错误,但如果它有效,它会将我重定向到主页,因为我输入了 ts 文件。顺便说一句,我只添加了与护照和此代码相关的内容,删除了不相关的内容。

login.component.ts 文件 ->

  signupForm!: FormGroup;
  constructor(private router:Router, private userService: UserService) { }

  ngOnInit(): void {
    this.signupForm = new FormGroup({
      'email': new FormControl(null,[Validators.required]),
      // 'email': new FormControl(null,[Validators.required,Validators.email]),
      'password': new FormControl(null,Validators.required)
    })
  }

  onSubmit(){
    this.userService.login(JSON.stringify(this.signupForm.value)).subscribe(data=>{console.log('Success');this.router.navigate(['/home']);}, error=>console.log(error))
   }

前台服务->

    return this.http.post(this.apiUrlL,body,{
      observe:'body',
      withCredentials:true,
      headers:new HttpHeaders().append('Content-Type','application/json')
    });
  }

前面的模特->

export class UserModel {
  public id!: number;
  public ime!: string;
  public prezime!: string;
  public email!: string;
  public password!: string;
  
  constructor() {}
}

Passport-config - 这里的代码不会通过函数中的

findOne()
方法。我在函数末尾发布了
console.log()
,但它从未被调用过,if case 的其余部分也没有。我收到的唯一消息是在控制台中说
(sequelize) Warning: Model attributes (email) passed into finder method options of model korisnik, but the  options.where object is empty. Did you forget to use options.where? Executing (default): SELECT `id`, `ime`, `prezime`, `email`, `sifra` AS `password` FROM `korisnik` AS `korisnik` LIMIT 1;
即使我添加 where 子句,
Select
消息也会显示,仅此而已。

Passport-config 在后面 ->

var passport = require("passport"),
  LocalStrategy = require("passport-local").Strategy;
const UserCont = require("../controller/user-cont");
var User = require("../model/user_data");

passport.use(
  "local",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
    },
    function (username, password, done) {
      User.User.findOne({ email: username }, function (err, user) {
        if (err) {
          return done(err, { message: "testcase." });
        }
        if (!user) {
          return done(null, false, { message: "Incorrect username." });
        }
        if (!UserCont.isValid(user.email, password)) {
          return done(null, false, { message: "Incorrect password." });
        }
        console.log("passport user", username);
        return done(null, user);
      });
    }
  )
);

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

passport.deserializeUser(function (id, done) {
  User.User.findById(id, function (err, user) {
    done(err, user);
  });
});

login.js 在后面 ->

var User = require("../model/user_data");
var passport = require("passport");

module.exports.loginUser = (req, res, next) => {
  passport.authenticate("local", function (err, user, info) {
    if (err) {
      return res.status(501).json(err);
    }
    if (!user) {
      return res.status(501).json(info);
    }
    req.logIn(user, function (err) {
      if (err) {
        return res.status(501).json(err);
      }
      return res.status(200).json({ message: "Login Success" });
    });
  })(req, res, next);
};

后面的用户控制器 ->

module.exports.isValid = (email, newPass) => {
  const salt = crypto.genSalt(10);
  const hashPass = crypto.hash(newPass, salt);
  User.User.findOne({ email: email }).then((user) => {
    crypto.compare(user.password, hashPass, function (err, ifValid) {
      if (ifValid == true) {
        console.log(ifValid);
        return true;
      }
    });
  });
};

用户路由文件 ->

const express = require("express");

const Login = require("../common/login");
const router = express.Router();
router.post("/login", Login.loginUser);
module.exports = router;

App.js(这还包含其他东西,我只是放了与护照相关的东西)->

//passport
var passport = require("passport");
var session = require("express-session");

app.use(
  session({
    name: "Session ID",
    resave: false,
    saveUninitialized: false,
    secret: "secret",
    cookie: {
      maxAge: 36000000,
      httpOnly: false,
      secure: false,
    },
  })
);
require("./common/passport-config");
app.use(passport.initialize());
app.use(passport.session());
//

app.use(express.json());

app.use("/api", userRouting);

模型数据库 ->

const Sequelize = require("sequelize");
const sequelize = require("./../common/db-config");
const Model = Sequelize.Model;

//User
class User extends Model {}

User.init(
  {
    id: {
      type: Sequelize.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: "id",
    },
    ime: {
      type: Sequelize.STRING,
      allowNull: false,
      field: "ime",
    },
    prezime: {
      type: Sequelize.STRING,
      allowNull: false,
      field: "prezime",
    },
    email: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      field: "email",
    },
    password: {
      type: Sequelize.STRING,
      allowNull: false,
      field: "sifra",
    },
  },
  {
    sequelize,
    modelName: "korisnik",
    tableName: "korisnik",
    timestamps: false,
  }
);

module.exports = { User };
node.js angular authentication sequelize.js passport.js
1个回答
0
投票

问题出在您的

passport-config.js
文件中。您忘记在 User findOne 中放置 where 子句。尝试以下方法,希望这会有所帮助。

var passport = require("passport"),
    LocalStrategy = require("passport-local").Strategy,
    User = require("../model/user_data");

const UserCont = require("../controller/user-cont");

passport.use(
  "local",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
    },
    function (username, password, done) {
       User.User.findOne({
         where: { email: username }
       }).then((user) => {
       if (!user) {
         return done(null, false, { message: `Username ${username} was not found.` });
        }
        user.comparePassword(password, (err, isMatch) => {
        if (err) {
          return done(null, false, {message: err});
        }
        if (isMatch) {
          return done(null, user);
        } else if(!isMatch) {
          return done(null, false, {message: 'Your password is invalid.'});
        }
       });
     });
    }
  )
);

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

passport.deserializeUser(function (id, done) {
  User.User.findById(id, function (err, user) {
    done(err, user);
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.