-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauthentication-example.ts
More file actions
155 lines (134 loc) · 3.89 KB
/
authentication-example.ts
File metadata and controls
155 lines (134 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/**
* Example for Authentication class system
* Shows server-level, router-level, and endpoint-level authentication
*/
import {
RestServer,
BaseApiRouter,
BaseApiEndpoint,
BearerAuthenticationScheme,
} from '../src';
// This endpoint inherits server-level authentication
class ProtectedEndpoint extends BaseApiEndpoint {
override path = '/protected';
override description = 'The token is: "valid-token-123"';
async handle() {
return {
message: 'This endpoint is protected by server-level auth',
authenticated: true,
};
}
}
class PublicEndpoint extends BaseApiEndpoint {
override path = '/info';
override description = 'This endpoint is public - no authentication needed';
async handle() {
return {
message: 'This endpoint is public',
authenticated: false,
};
}
}
// Router explicitly made public (no authentication)
class PublicRouter extends BaseApiRouter {
override path = '/public';
override authentication = null; // Explicitly public - overrides server auth
override description = 'Public routes - no authentication required';
async routes() {
return [PublicEndpoint];
}
}
class AdminDashboardEndpoint extends BaseApiEndpoint {
override path = '/dashboard';
override description =
'Admin dashboard - requires AdminAuth. ' +
'The token is: "admin-token-456"';
async handle() {
return {
message: 'Admin dashboard - requires AdminAuth',
role: 'admin',
};
}
}
// Endpoint with even more restrictive authentication
class SuperAdminEndpoint extends BaseApiEndpoint {
override path = '/super-admin';
override description =
'Super admin area - requires SuperAdminAuth. ' +
'The token is: "super-admin-token-789"';
// Endpoint-level override for super admin
override authentication = new BearerAuthenticationScheme({
checkToken: async (token: string) => {
return token === 'super-admin-token-789';
},
schemeName: 'SuperAdminAuth',
bearerFormat: 'JWT',
description: 'Super admin authentication',
});
async handle() {
return {
message: 'Super admin area - requires SuperAdminAuth.',
role: 'super-admin',
};
}
}
// Router with different authentication scheme
class AdminRouter extends BaseApiRouter {
override path = '/admin';
// Override with stricter authentication
override authentication = new BearerAuthenticationScheme({
checkToken: async (token: string) => {
// Admin token validation
return token === 'admin-token-456';
},
schemeName: 'AdminAuth',
bearerFormat: 'JWT',
description: 'Admin-level JWT authentication',
});
async routes() {
return [AdminDashboardEndpoint, SuperAdminEndpoint];
}
}
// Router inherits server authentication automatically
class MainRouter extends BaseApiRouter {
override path = '/api';
async routes() {
return [ProtectedEndpoint, PublicRouter, AdminRouter];
}
}
class AuthenticatedServer extends RestServer {
override router = MainRouter;
override name = 'Authentication Example API';
override version = '1.0.0';
constructor() {
super({
port: 4000,
swaggerEnabled: true,
// Server-level authentication - applies to all routes by default
authentication: new BearerAuthenticationScheme({
checkToken: async (token: string) => {
// In real app, validate against database/JWT
return token === 'valid-token-123';
},
bearerFormat: 'JWT',
description: 'JWT Bearer token authentication',
}),
});
}
}
// Start the server
async function main() {
const server = new AuthenticatedServer();
await server.start();
console.log(`Server running on http://localhost:${server.port}`);
console.log('\nEndpoints:');
console.log(' Protected: GET /api/protected (valid-token-123)');
console.log(' Public: GET /api/public/info (no auth required)');
console.log(' Admin: GET /api/admin/dashboard (admin-token-456)');
console.log(
' SuperAdmin:GET /api/admin/super-admin (super-admin-token-789)'
);
}
if (require.main === module) {
main().catch(console.error);
}