【问题标题】:Why is deserializeUser not being called? Angular and Express为什么不调用deserializeUser?角度和快递
【发布时间】:2021-01-19 04:40:45
【问题描述】:

我已经阅读了所有与我的堆栈溢出相关的问题以及我能找到的其他任何地方......

我无法解决我的问题...

我正在使用 Angular 和 Express...

我使用 withCredentials

这是我的 app.ts 文件/app.js 编译后

import express = require('express');
import dotenv = require('dotenv');
import router from './routes';
import cors from 'cors';
import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser';
import session = require('express-session');
import passport from 'passport';

dotenv.config();

const secret_key: string = (process.env.SECRET_KEY as string);

const app: express.Application = express();


// Add headers
const options: cors.CorsOptions = {
    allowedHeaders: [
        'Origin',
        'X-Requested-With',
        'Content-Type',
        'Accept',
        'X-Access-Token',
    ],
    credentials: true,
    methods: 'GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE',
    origin: 'http://localhost:4200',
    preflightContinue: false,
};
app.use(cors(options));
app.use(express.static(__dirname + 'public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

app.options('*', cors(options));

app.use(session({
    secret: 'test-secret',
    resave: true,
    saveUninitialized: true,
    cookie: { maxAge: 2 * 60 * 60 * 1000/* 2 hours */, secure: false }
}));

app.use(passport.initialize());
app.use(passport.session());

app.use(passport.initialize(), router);

app.listen(process.env.PORT, () => console.log(`Hello world app listening on port ${process.env.PORT}!`));

序列化和反序列化所在的passport.js 文件。

import passport from 'passport';
import { knex } from './knex/knex';

export default () => {
    passport.serializeUser((user: any, done: any) => {
        console.log('inside ser');
        done(null, user.userId);
    });

    passport.deserializeUser((userId: any, done: any) => {
        console.log('inside des');
        knex('accounts').where({userId: userId}).first()
        .then((user) => { done(null, user); console.log(user)})
        .catch((err) => { done(err, null); console.log(`deserialoize Error ${err}`) });
    });
}

local.js init 用于序列化和反序列化

import passport from 'passport';
import { Strategy as LocalStrategy } from 'passport-local';

import init = require('../passport');
import { knex } from '../knex/knex';
import * as bcrypt from 'bcrypt';

const options = {
    usernameField: 'email',
    passwordField: 'password'
};

init.default();

export default passport.use(new LocalStrategy(options, (username, password, done) => {
    knex('accounts').where({userEmail: username}).first()
    .then((user) => {
        if (!user) return done(null, false)
        if(!bcrypt.compareSync(password, user.userPassword)) {
            return done(null, false);
        }
        else {
            return done(null, user);
        }
    })
    .catch((err) => { return done(err); });
}));

这是我的用户控制器

export const userLogIn = async (req: Request, res: Response) => {
    
    passport.default.authenticate('local', (err, user, info) => {
        if (err) { res.status(500).send('error'); console.log(err)}
        if (!user) { res.status(404).send('User not found!'); }
        if (user)
        {
            req.logIn(user, function (err) {
                if (err) { res.status(500).send('error'); console.log(err)}
                res.status(200);
            });
        }
    })(req, res);
}

这就是我从 angular 发出请求的方式

logInUser(value: any): void{
    this.http.post<any>('http://localhost:3000/login', value, { withCredentials: true }).subscribe(data => {
      //let user: User = data;
      //console.warn(data);
    });
  }

我已经苦苦挣扎了将近 2 天......

我知道这不是最好的打字稿代码,我会在学习的过程中不断改进它,但现在我想解决这个问题,我认为它与打字稿无关。

如果有帮助,我检查了 sessionID 并且它是相同的,会话也存储在请求中,并带有我设置的 maxAge 等

但是来自 angular 的请求没有 request.user

并且 serializeUser 正在被调用,但 deserializeUser 没有

【问题讨论】:

    标签: angular typescript express passport.js


    【解决方案1】:

    您的方法中似乎有错字。请注意,passport 添加了req.login 方法不是 req.logIn

    【讨论】:

    • 你好 @jasonandmonte 看看这张图片 ibb.co/g7JpH9D 我有两个选项,登录和登录,注销和注销
    猜你喜欢
    • 2021-02-03
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2014-11-24
    • 2014-09-14
    • 2020-01-23
    • 2016-09-21
    相关资源
    最近更新 更多