Compare commits
1 Commits
0a4cb62065
...
81dfc227e3
| Author | SHA1 | Date | |
|---|---|---|---|
| 81dfc227e3 |
24
.env.example
24
.env.example
@@ -1,17 +1,17 @@
|
||||
# Server
|
||||
PORT=7001
|
||||
FABRIC_BACKEND_CENTER_PORT=7001
|
||||
|
||||
# MySQL
|
||||
DB_HOST=mysql-center
|
||||
DB_PORT=3306
|
||||
DB_USER=fabric
|
||||
DB_PASSWORD=fabric
|
||||
DB_NAME=fabric_center
|
||||
DB_SYNC=true
|
||||
DB_LOGGING=false
|
||||
FABRIC_BACKEND_CENTER_DB_HOST=mysql-center
|
||||
FABRIC_BACKEND_CENTER_DB_PORT=3306
|
||||
FABRIC_BACKEND_CENTER_DB_USER=fabric
|
||||
FABRIC_BACKEND_CENTER_DB_PASSWORD=fabric
|
||||
FABRIC_BACKEND_CENTER_DB_NAME=fabric_center
|
||||
FABRIC_BACKEND_CENTER_DB_SYNC=true
|
||||
FABRIC_BACKEND_CENTER_DB_LOGGING=false
|
||||
|
||||
# Auth (to be used in auth module)
|
||||
JWT_ACCESS_SECRET=change-me-access
|
||||
JWT_REFRESH_SECRET=change-me-refresh
|
||||
JWT_ACCESS_EXPIRES_IN=15m
|
||||
JWT_REFRESH_EXPIRES_IN=30d
|
||||
FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET=change-me-access
|
||||
FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET=change-me-refresh
|
||||
FABRIC_BACKEND_CENTER_JWT_ACCESS_EXPIRES_IN=15m
|
||||
FABRIC_BACKEND_CENTER_JWT_REFRESH_EXPIRES_IN=30d
|
||||
|
||||
@@ -16,20 +16,20 @@ import { AuditService } from '../audit/audit.service';
|
||||
import { parseDurationToSeconds } from './token.util';
|
||||
|
||||
function signAccessToken(userId: string, email: string): string {
|
||||
const secret = process.env.JWT_ACCESS_SECRET as string;
|
||||
const expiresIn = parseDurationToSeconds(process.env.JWT_ACCESS_EXPIRES_IN ?? '15m', 900);
|
||||
const secret = process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string;
|
||||
const expiresIn = parseDurationToSeconds(process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_EXPIRES_IN ?? '15m', 900);
|
||||
return jwt.sign({ sub: userId, email }, secret, { expiresIn });
|
||||
}
|
||||
|
||||
function signRefreshToken(userId: string, email: string): string {
|
||||
const secret = process.env.JWT_REFRESH_SECRET as string;
|
||||
const expiresIn = parseDurationToSeconds(process.env.JWT_REFRESH_EXPIRES_IN ?? '30d', 2592000);
|
||||
const secret = process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET as string;
|
||||
const expiresIn = parseDurationToSeconds(process.env.FABRIC_BACKEND_CENTER_JWT_REFRESH_EXPIRES_IN ?? '30d', 2592000);
|
||||
return jwt.sign({ sub: userId, email, typ: 'refresh' }, secret, { expiresIn });
|
||||
}
|
||||
|
||||
function signGuildAccessToken(userId: string, email: string, guildNodeId: string): string {
|
||||
const secret = process.env.JWT_ACCESS_SECRET as string;
|
||||
const expiresIn = parseDurationToSeconds(process.env.JWT_ACCESS_EXPIRES_IN ?? '15m', 900);
|
||||
const secret = process.env.FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET as string;
|
||||
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 });
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ export class AuthService {
|
||||
|
||||
verifyCenterAccessToken(accessToken: string): jwt.JwtPayload {
|
||||
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');
|
||||
return payload;
|
||||
} catch {
|
||||
@@ -177,7 +177,7 @@ export class AuthService {
|
||||
async introspectGuildToken(token: string, guildNodeId: string) {
|
||||
let payload: jwt.JwtPayload;
|
||||
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 {
|
||||
return { active: false };
|
||||
}
|
||||
@@ -206,7 +206,7 @@ export class AuthService {
|
||||
async refresh(refreshToken: string) {
|
||||
let payload: jwt.JwtPayload;
|
||||
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 {
|
||||
throw new UnauthorizedException('invalid refresh token');
|
||||
}
|
||||
@@ -243,7 +243,7 @@ export class AuthService {
|
||||
async logout(refreshToken: string) {
|
||||
let payload: jwt.JwtPayload;
|
||||
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 {
|
||||
return { status: 'ok' };
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@ import { GuildUser } from './entities/guild-user.entity';
|
||||
|
||||
export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({
|
||||
type: 'mysql',
|
||||
host: process.env.DB_HOST ?? 'mysql-center',
|
||||
port: Number(process.env.DB_PORT ?? 3306),
|
||||
username: process.env.DB_USER ?? 'fabric',
|
||||
password: process.env.DB_PASSWORD ?? 'fabric',
|
||||
database: process.env.DB_NAME ?? 'fabric_center',
|
||||
host: process.env.FABRIC_BACKEND_CENTER_DB_HOST ?? 'mysql-center',
|
||||
port: Number(process.env.FABRIC_BACKEND_CENTER_DB_PORT ?? 3306),
|
||||
username: process.env.FABRIC_BACKEND_CENTER_DB_USER ?? 'fabric',
|
||||
password: process.env.FABRIC_BACKEND_CENTER_DB_PASSWORD ?? 'fabric',
|
||||
database: process.env.FABRIC_BACKEND_CENTER_DB_NAME ?? 'fabric_center',
|
||||
entities: [User, GuildNode, GuildUser, AuditLog],
|
||||
synchronize: (process.env.DB_SYNC ?? 'true') === 'true',
|
||||
logging: (process.env.DB_LOGGING ?? 'false') === 'true',
|
||||
synchronize: (process.env.FABRIC_BACKEND_CENTER_DB_SYNC ?? 'true') === '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 {
|
||||
requireEnv('DB_HOST');
|
||||
requireEnv('DB_PORT');
|
||||
requireEnv('DB_USER');
|
||||
requireEnv('DB_PASSWORD');
|
||||
requireEnv('DB_NAME');
|
||||
requireEnv('JWT_ACCESS_SECRET');
|
||||
requireEnv('JWT_REFRESH_SECRET');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_DB_HOST');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_DB_PORT');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_DB_USER');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_DB_PASSWORD');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_DB_NAME');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_JWT_ACCESS_SECRET');
|
||||
requireEnv('FABRIC_BACKEND_CENTER_JWT_REFRESH_SECRET');
|
||||
}
|
||||
|
||||
async function bootstrap() {
|
||||
@@ -47,7 +47,7 @@ async function bootstrap() {
|
||||
const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig);
|
||||
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);
|
||||
console.log(`Fabric.Backend.Center listening on :${port}`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user