@rytass/member-base-nestjs-module
Version:
Rytass Member System NestJS Base Module
172 lines (169 loc) • 7.25 kB
JavaScript
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 };