UNPKG

@rytass/member-base-nestjs-module

Version:

Rytass Member System NestJS Base Module

172 lines (169 loc) 7.25 kB
import { Get, Param, Res, Query, Controller, Inject, NotFoundException } from '@nestjs/common'; import { IsPublic } from '../decorators/is-public.decorator.js'; import { OAUTH2_PROVIDERS, OAUTH2_CLIENT_DEST_URL, COOKIE_MODE, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from '../typings/member-base.tokens.js'; import { OAuthService } from '../services/oauth.service.js'; function _ts_decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; } function _ts_metadata(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } function _ts_param(paramIndex, decorator) { return function(target, key) { decorator(target, key, paramIndex); }; } class OAuthCallbacksController { providers; clientDestUrl; cookieMode; accessTokenCookieName; refreshTokenCookieName; oauthService; constructor(providers, clientDestUrl, cookieMode, accessTokenCookieName, refreshTokenCookieName, oauthService){ this.providers = providers; this.clientDestUrl = clientDestUrl; this.cookieMode = cookieMode; this.accessTokenCookieName = accessTokenCookieName; this.refreshTokenCookieName = refreshTokenCookieName; this.oauthService = oauthService; } async redirectURL(channel, res) { const provider = this.providers.find((p)=>p.channel === channel); if (!provider) { throw new NotFoundException(); } switch(provider.channel){ case 'google': { const url = await this.oauthService.getGoogleOAuthLoginUrl(); res.redirect(url); break; } case 'facebook': { const url = await this.oauthService.getFacebookOAuthLoginUrl(); res.redirect(url); break; } default: { const url = await this.oauthService.getCustomOAuthLoginUrl(channel); res.redirect(url); break; } } } async callback(code, state, channel, res) { const provider = this.providers.find((p)=>p.channel === channel); if (!provider) { throw new NotFoundException(); } switch(provider.channel){ case 'google': { const tokenPair = await this.oauthService.loginWithGoogleOAuth2Code(code, state); if (this.cookieMode) { res.cookie(this.accessTokenCookieName, tokenPair.accessToken, { httpOnly: true, secure: true }); res.cookie(this.refreshTokenCookieName, tokenPair.refreshToken, { httpOnly: true, secure: true }); res.redirect(this.clientDestUrl); } else { res.redirect(`${this.clientDestUrl}?accessToken=${tokenPair.accessToken}&refreshToken=${tokenPair.refreshToken}${tokenPair.state ? `&state=${tokenPair.state}` : ''}`); } break; } case 'facebook': { const tokenPair = await this.oauthService.loginWithFacebookOAuth2Code(code, state); if (this.cookieMode) { res.cookie(this.accessTokenCookieName, tokenPair.accessToken, { httpOnly: true, secure: true }); res.cookie(this.refreshTokenCookieName, tokenPair.refreshToken, { httpOnly: true, secure: true }); res.redirect(this.clientDestUrl); } else { res.redirect(`${this.clientDestUrl}?accessToken=${tokenPair.accessToken}&refreshToken=${tokenPair.refreshToken}${tokenPair.state ? `&state=${tokenPair.state}` : ''}`); } break; } default: { const tokenPair = await this.oauthService.loginWithCustomOAuth2Code(channel, code, state); if (this.cookieMode) { res.cookie(this.accessTokenCookieName, tokenPair.accessToken, { httpOnly: true, secure: true }); res.cookie(this.refreshTokenCookieName, tokenPair.refreshToken, { httpOnly: true, secure: true }); res.redirect(this.clientDestUrl); } else { res.redirect(`${this.clientDestUrl}?accessToken=${tokenPair.accessToken}&refreshToken=${tokenPair.refreshToken}${tokenPair.state ? `&state=${tokenPair.state}` : ''}`); } break; } } } } _ts_decorate([ Get('/login/:channel'), IsPublic(), _ts_param(0, Param('channel')), _ts_param(1, Res()), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ String, typeof Response === "undefined" ? Object : Response ]), _ts_metadata("design:returntype", Promise) ], OAuthCallbacksController.prototype, "redirectURL", null); _ts_decorate([ Get('/callbacks/:channel'), IsPublic(), _ts_param(0, Query('code')), _ts_param(1, Query('state')), _ts_param(2, Param('channel')), _ts_param(3, Res()), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ String, String, String, typeof Response === "undefined" ? Object : Response ]), _ts_metadata("design:returntype", Promise) ], OAuthCallbacksController.prototype, "callback", null); OAuthCallbacksController = _ts_decorate([ Controller('/auth'), _ts_param(0, Inject(OAUTH2_PROVIDERS)), _ts_param(1, Inject(OAUTH2_CLIENT_DEST_URL)), _ts_param(2, Inject(COOKIE_MODE)), _ts_param(3, Inject(ACCESS_TOKEN_COOKIE_NAME)), _ts_param(4, Inject(REFRESH_TOKEN_COOKIE_NAME)), _ts_param(5, Inject(OAuthService)), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ Array, String, Boolean, String, String, typeof OAuthService === "undefined" ? Object : OAuthService ]) ], OAuthCallbacksController); export { OAuthCallbacksController };