我正在学习教程并尝试使用护照登录,但使用我的代码。但是在尝试登录时,我的表单,即我按下按钮时的 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 };
问题出在您的
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);
});
});