Compare commits

...

1 Commits

4 changed files with 37 additions and 37 deletions

View File

@@ -1,17 +1,17 @@
# Server # Server
PORT=7001 FABRIC_BACKEND_CENTER_PORT=7001
# MySQL # MySQL
DB_HOST=mysql-center FABRIC_BACKEND_CENTER_DB_HOST=mysql-center
DB_PORT=3306 FABRIC_BACKEND_CENTER_DB_PORT=3306
DB_USER=fabric FABRIC_BACKEND_CENTER_DB_USER=fabric
DB_PASSWORD=fabric FABRIC_BACKEND_CENTER_DB_PASSWORD=fabric
DB_NAME=fabric_center FABRIC_BACKEND_CENTER_DB_NAME=fabric_center
DB_SYNC=true FABRIC_BACKEND_CENTER_DB_SYNC=true
DB_LOGGING=false FABRIC_BACKEND_CENTER_DB_LOGGING=false
# Auth (to be used in auth module) # Auth (to be used in auth module)
JWT_ACCESS_SECRET=change-me-access FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET=change-me-access
JWT_REFRESH_SECRET=change-me-refresh FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET=change-me-refresh
JWT_ACCESS_EXPIRES_IN=15m FABRIC_BACKEND_CENTER_JWT_ACCESS_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=30d FABRIC_BACKEND_CENTER_JWT_REFRESH_EXPIRES_IN=30d

View File

@@ -16,20 +16,20 @@ import { AuditService } from '../audit/audit.service';
import { parseDurationToSeconds } from './token.util'; import { parseDurationToSeconds } from './token.util';
function signAccessToken(userId: string, email: string): string { function signAccessToken(userId: string, email: string): string {
const secret = process.env.JWT_ACCESS_SECRET as string; const secret = process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string;
const expiresIn = parseDurationToSeconds(process.env.JWT_ACCESS_EXPIRES_IN ?? '15m', 900); const expiresIn = parseDurationToSeconds(process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_EXPIRES_IN ?? '15m', 900);
return jwt.sign({ sub: userId, email }, secret, { expiresIn }); return jwt.sign({ sub: userId, email }, secret, { expiresIn });
} }
function signRefreshToken(userId: string, email: string): string { function signRefreshToken(userId: string, email: string): string {
const secret = process.env.JWT_REFRESH_SECRET as string; const secret = process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET as string;
const expiresIn = parseDurationToSeconds(process.env.JWT_REFRESH_EXPIRES_IN ?? '30d', 2592000); const expiresIn = parseDurationToSeconds(process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_EXPIRES_IN ?? '30d', 2592000);
return jwt.sign({ sub: userId, email, typ: 'refresh' }, secret, { expiresIn }); return jwt.sign({ sub: userId, email, typ: 'refresh' }, secret, { expiresIn });
} }
function signGuildAccessToken(userId: string, email: string, guildNodeId: string): string { function signGuildAccessToken(userId: string, email: string, guildNodeId: string): string {
const secret = process.env.JWT_ACCESS_SECRET as string; const secret = process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string;
const expiresIn = parseDurationToSeconds(process.env.JWT_ACCESS_EXPIRES_IN ?? '15m', 900); const expiresIn = parseDurationToSeconds(process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_EXPIRES_IN ?? '15m', 900);
return jwt.sign({ sub: userId, email, gid: guildNodeId, typ: 'guild_access' }, secret, { expiresIn }); return jwt.sign({ sub: userId, email, gid: guildNodeId, typ: 'guild_access' }, secret, { expiresIn });
} }
@@ -166,7 +166,7 @@ export class AuthService {
verifyCenterAccessToken(accessToken: string): jwt.JwtPayload { verifyCenterAccessToken(accessToken: string): jwt.JwtPayload {
try { try {
const payload = jwt.verify(accessToken, process.env.JWT_ACCESS_SECRET as string) as jwt.JwtPayload; const payload = jwt.verify(accessToken, process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string) as jwt.JwtPayload;
if (!payload?.sub) throw new Error('invalid'); if (!payload?.sub) throw new Error('invalid');
return payload; return payload;
} catch { } catch {
@@ -177,7 +177,7 @@ export class AuthService {
async introspectGuildToken(token: string, guildNodeId: string) { async introspectGuildToken(token: string, guildNodeId: string) {
let payload: jwt.JwtPayload; let payload: jwt.JwtPayload;
try { try {
payload = jwt.verify(token, process.env.JWT_ACCESS_SECRET as string) as jwt.JwtPayload; payload = jwt.verify(token, process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string) as jwt.JwtPayload;
} catch { } catch {
return { active: false }; return { active: false };
} }
@@ -206,7 +206,7 @@ export class AuthService {
async refresh(refreshToken: string) { async refresh(refreshToken: string) {
let payload: jwt.JwtPayload; let payload: jwt.JwtPayload;
try { try {
payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET as string) as jwt.JwtPayload; payload = jwt.verify(refreshToken, process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET as string) as jwt.JwtPayload;
} catch { } catch {
throw new UnauthorizedException('invalid refresh token'); throw new UnauthorizedException('invalid refresh token');
} }
@@ -243,7 +243,7 @@ export class AuthService {
async logout(refreshToken: string) { async logout(refreshToken: string) {
let payload: jwt.JwtPayload; let payload: jwt.JwtPayload;
try { try {
payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET as string) as jwt.JwtPayload; payload = jwt.verify(refreshToken, process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET as string) as jwt.JwtPayload;
} catch { } catch {
return { status: 'ok' }; return { status: 'ok' };
} }

View File

@@ -6,12 +6,12 @@ import { GuildUser } from './entities/guild-user.entity';
export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({ export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({
type: 'mysql', type: 'mysql',
host: process.env.DB_HOST ?? 'mysql-center', host: process.env.FABRIC_BACKEND_CENTER_DB_HOST ?? 'mysql-center',
port: Number(process.env.DB_PORT ?? 3306), port: Number(process.env.FABRIC_BACKEND_CENTER_DB_PORT ?? 3306),
username: process.env.DB_USER ?? 'fabric', username: process.env.FABRIC_BACKEND_CENTER_DB_USER ?? 'fabric',
password: process.env.DB_PASSWORD ?? 'fabric', password: process.env.FABRIC_BACKEND_CENTER_DB_PASSWORD ?? 'fabric',
database: process.env.DB_NAME ?? 'fabric_center', database: process.env.FABRIC_BACKEND_CENTER_DB_NAME ?? 'fabric_center',
entities: [User, GuildNode, GuildUser, AuditLog], entities: [User, GuildNode, GuildUser, AuditLog],
synchronize: (process.env.DB_SYNC ?? 'true') === 'true', synchronize: (process.env.FABRIC_BACKEND_CENTER_DB_SYNC ?? 'true') === 'true',
logging: (process.env.DB_LOGGING ?? 'false') === 'true', logging: (process.env.FABRIC_BACKEND_CENTER_DB_LOGGING ?? 'false') === 'true',
}); });

View File

@@ -15,13 +15,13 @@ function requireEnv(name: string): string {
} }
function validateEnv(): void { function validateEnv(): void {
requireEnv('DB_HOST'); requireEnv('FABRIC_BACKEND_CENTER_DB_HOST');
requireEnv('DB_PORT'); requireEnv('FABRIC_BACKEND_CENTER_DB_PORT');
requireEnv('DB_USER'); requireEnv('FABRIC_BACKEND_CENTER_DB_USER');
requireEnv('DB_PASSWORD'); requireEnv('FABRIC_BACKEND_CENTER_DB_PASSWORD');
requireEnv('DB_NAME'); requireEnv('FABRIC_BACKEND_CENTER_DB_NAME');
requireEnv('JWT_ACCESS_SECRET'); requireEnv('FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET');
requireEnv('JWT_REFRESH_SECRET'); requireEnv('FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET');
} }
async function bootstrap() { async function bootstrap() {
@@ -47,7 +47,7 @@ async function bootstrap() {
const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig); const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig);
SwaggerModule.setup('docs', app, swaggerDoc); SwaggerModule.setup('docs', app, swaggerDoc);
const port = process.env.PORT ? Number(process.env.PORT) : 7001; const port = process.env.FABRIC_BACKEND_CENTER_PORT ? Number(process.env.FABRIC_BACKEND_CENTER_PORT) : 7001;
await app.listen(port); await app.listen(port);
console.log(`Fabric.Backend.Center listening on :${port}`); console.log(`Fabric.Backend.Center listening on :${port}`);
} }