1 | "use strict";
|
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7 | };
|
8 | var __metadata = (this && this.__metadata) || function (k, v) {
|
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
10 | };
|
11 | var __param = (this && this.__param) || function (paramIndex, decorator) {
|
12 | return function (target, key) { decorator(target, key, paramIndex); }
|
13 | };
|
14 | Object.defineProperty(exports, "__esModule", { value: true });
|
15 | exports.AuthGuard = void 0;
|
16 | const common_1 = require("@nestjs/common");
|
17 | const passport = require("passport");
|
18 | const auth_module_options_1 = require("./interfaces/auth-module.options");
|
19 | const options_1 = require("./options");
|
20 | const memoize_util_1 = require("./utils/memoize.util");
|
21 | exports.AuthGuard = (0, memoize_util_1.memoize)(createAuthGuard);
|
22 | const NO_STRATEGY_ERROR = `In order to use "defaultStrategy", please, ensure to import PassportModule in each place where AuthGuard() is being used. Otherwise, passport won't work correctly.`;
|
23 | const authLogger = new common_1.Logger('AuthGuard');
|
24 | function createAuthGuard(type) {
|
25 | let MixinAuthGuard = class MixinAuthGuard {
|
26 | constructor(options) {
|
27 | this.options = {};
|
28 | this.options = options ?? this.options;
|
29 | if (!type && !this.options.defaultStrategy) {
|
30 | authLogger.error(NO_STRATEGY_ERROR);
|
31 | }
|
32 | }
|
33 | async canActivate(context) {
|
34 | const options = {
|
35 | ...options_1.defaultOptions,
|
36 | ...this.options,
|
37 | ...(await this.getAuthenticateOptions(context))
|
38 | };
|
39 | const [request, response] = [
|
40 | this.getRequest(context),
|
41 | this.getResponse(context)
|
42 | ];
|
43 | const passportFn = createPassportContext(request, response);
|
44 | const user = await passportFn(type || this.options.defaultStrategy, options, (err, user, info, status) => this.handleRequest(err, user, info, context, status));
|
45 | request[options.property || options_1.defaultOptions.property] = user;
|
46 | return true;
|
47 | }
|
48 | getRequest(context) {
|
49 | return context.switchToHttp().getRequest();
|
50 | }
|
51 | getResponse(context) {
|
52 | return context.switchToHttp().getResponse();
|
53 | }
|
54 | async logIn(request) {
|
55 | const user = request[this.options.property || options_1.defaultOptions.property];
|
56 | await new Promise((resolve, reject) => request.logIn(user, this.options, (err) => err ? reject(err) : resolve()));
|
57 | }
|
58 | handleRequest(err, user, info, context, status) {
|
59 | if (err || !user) {
|
60 | throw err || new common_1.UnauthorizedException();
|
61 | }
|
62 | return user;
|
63 | }
|
64 | getAuthenticateOptions(context) {
|
65 | return undefined;
|
66 | }
|
67 | };
|
68 | __decorate([
|
69 | (0, common_1.Optional)(),
|
70 | (0, common_1.Inject)(auth_module_options_1.AuthModuleOptions),
|
71 | __metadata("design:type", auth_module_options_1.AuthModuleOptions)
|
72 | ], MixinAuthGuard.prototype, "options", void 0);
|
73 | MixinAuthGuard = __decorate([
|
74 | __param(0, (0, common_1.Optional)()),
|
75 | __metadata("design:paramtypes", [auth_module_options_1.AuthModuleOptions])
|
76 | ], MixinAuthGuard);
|
77 | const guard = (0, common_1.mixin)(MixinAuthGuard);
|
78 | return guard;
|
79 | }
|
80 | const createPassportContext = (request, response) => (type, options, callback) => new Promise((resolve, reject) => passport.authenticate(type, options, (err, user, info, status) => {
|
81 | try {
|
82 | request.authInfo = info;
|
83 | return resolve(callback(err, user, info, status));
|
84 | }
|
85 | catch (err) {
|
86 | reject(err);
|
87 | }
|
88 | })(request, response, (err) => (err ? reject(err) : resolve())));
|