Closed
Description
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
Labels
No labels