· 7 years ago · Nov 12, 2018, 02:28 PM
1import { createParamDecorator } from '@nestjs/common';
2import { AuthGuard } from '@nestjs/passport';
3
4export const User = createParamDecorator((data, req) => {
5 return req.user;
6});
7
8@Injectable()
9export class AuthInterceptor implements NestInterceptor {
10 intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> {
11 const request = context.switchToHttp().getRequest();
12 const response = context.switchToHttp().getResponse();
13 const passportFn = this.createPassportContext(request, response);
14 return from(passportFn({}))
15 .pipe(map(user => request.user = user),
16 switchMap(() => call$),
17 );
18 }
19
20 createPassportContext(request, response) {
21 return (options) =>
22 new Promise((resolve, reject) =>
23 // If you are not using the JWT, change it here.
24 passport.authenticate('jwt', options, (err, user, info) => {
25 try {
26 request.authInfo = info;
27 return resolve(user);
28 } catch (err) {
29 reject(err);
30 }
31 })(request, response, err => (err ? reject(err) : resolve)),
32 );
33 }
34}
35
36@Injectable()
37export class JwtStrategy extends PassportStrategy(Strategy) {
38 constructor(private readonly authService: AuthService) {
39 super({
40 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
41 secretOrKey: 'secretKey',
42 });
43 }
44
45 async validate(payload) {
46 const user = await this.authService.validateUser(payload);
47 return user;
48 }
49}
50
51@UseInterceptors(AuthInterceptor)
52@Get()
53getUser3(@User() user) {
54 return {user};
55}