Skip to content

Loaders issues #169

Closed
Closed
@billbarni

Description

@billbarni

I tried building a passportLoader:

import 'reflect-metadata';

import * as bcrypt from 'bcrypt';
import * as express from 'express';
import passport from 'passport';
import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework-w3tec';
import { Strategy as JwtStrategy } from 'passport-jwt';
import { Strategy as LocalStrategy } from 'passport-local';
import { User } from 'src/api/models/User';
import { UserService } from 'src/api/services/UserService';
import Container from 'typedi';

import { env } from '../env';

export const passportLoader: MicroframeworkLoader = async (settings: MicroframeworkSettings | undefined) => {

    const userService: UserService = Container.get('UserService');

    function cookieExtractor(req: express.Request): string {
        let token = undefined;
        if (req && req.cookies) {
            token = req.cookies.tokenName;
        }
        return token;
    }

    const localOpts = {
        usernameField: 'username',
        passwordField: 'password',
        session: false,
    };

    passport.use('local', new LocalStrategy(localOpts, async (username, password, done) => {
        try {
            const user: User | undefined = await userService.findOne(username);

            if (!user) {
                return done(undefined, false);
            }

            if (!bcrypt.compareSync(password, user.password)) {
                return done(undefined, false);
            }

            return done(undefined, user);
        } catch (error) {
            return done(undefined, false);
        }
    }));

    const jwtOpts = {
        jwtFromRequest: cookieExtractor,
        secretOrKey: env.auth.secretOrKey,
        issuer: env.auth.secretOrKey,
        audience: env.auth.audience,
        passReqToCallback: env.auth.passReqToCallback,
        algorithms: env.auth.algorithms,
    };

    passport.use('jwtCookie', new JwtStrategy(jwtOpts, async (payload, done) => {
        try {
            if (!payload.id) {
                return done(undefined, false);
            }

            const user: User | undefined = await userService.findOne(payload.id);

            return done(undefined, user);
        } catch (error) {
            return done(undefined, false);
        }
    }));

    passport.serializeUser((user: any, done) => done(undefined, user));

    passport.deserializeUser(async (id: string, done) => {
        const user: User | undefined = await userService.findOne(id);
        done(undefined, user);
    });

    const expressApp = settings.getData('express_app');

    expressApp.use(passport.initialize());
    expressApp.use(passport.session());
};
@Service()
@JsonController('/users')
export class UserController {

    @Post('/login')
    public async login(@Req() req: any, @Res() res: Response): Promise<any> {
        return passport.authenticate('local'); // you can write any string here, it does not work nor gives errors
    }

}

But it did not work... any ideas why?

'Containet.get' can only be used with the string parameter, if I try to call the class I get an error when running.
I don't know how am I supposed to instance winston logger inside here as well.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions