UNPKG

@rytass/member-base-nestjs-module

Version:

Rytass Member System NestJS Base Module

128 lines (125 loc) 5.36 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 } from '../typings/member-base-providers.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_param(paramIndex, decorator) { return function(target, key) { decorator(target, key, paramIndex); }; } class OAuthCallbacksController { providers; clientDestUrl; cookieMode; oauthService; constructor(providers, clientDestUrl, cookieMode, oauthService){ this.providers = providers; this.clientDestUrl = clientDestUrl; this.cookieMode = cookieMode; 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('token', 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('token', 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('token', 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()) ], 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()) ], 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(OAuthService)) ], OAuthCallbacksController); export { OAuthCallbacksController };