Búsqueda de sitios web

typescript - ¿Por qué no se está llamando a deserializeUser? Angular y Express


Ya he leído todas las preguntas relacionadas con la mía en Stack Overflow y en todos los demás lugares donde pude encontrar...

No puedo resolver mi problema...

Estoy usando Angular y Express...

Uso withCredentials

este es mi archivo app.ts/app.js una vez compilado

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}!`));

archivo passport.js donde se serializan y deserializan.

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}`) });
    });
}

La inicialización de local.js es para serializar y deserializar

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); });
}));

este es mi controlador de usuario

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);
}

así es como hago la solicitud desde 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);
    });
  }

He estado luchando casi 2 días...

Sé que no es el mejor código de TypeScript, sigo mejorándolo a medida que aprendo, pero ahora quiero resolver este problema y no creo que esté relacionado con TypeScript.

Si ayuda, verifiqué el sessionID y es el mismo, además la sesión se almacena en la solicitud con el maxAge que he establecido, etc.

pero no hay request.user en las solicitudes que vienen de Angular

y se está llamando a serializeUser pero no a deserializeUser

Respuesta #1

Parece que hay un error tipográfico en tu método. Ten en cuenta que passport agrega el método req.login no req.logIn.