Compare commits
1 Commits
0a4cb62065
...
81dfc227e3
| Author | SHA1 | Date | |
|---|---|---|---|
| 81dfc227e3 |
24
.env.example
24
.env.example
@@ -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
|
||||||
|
|||||||
@@ -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' };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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',
|
||||||
});
|
});
|
||||||
|
|||||||
16
src/main.ts
16
src/main.ts
@@ -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}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user