1
1
import fastifyFormBody from '@fastify/formbody' ;
2
+ import { getConfig } from 'config' ;
2
3
import fastify from 'fastify' ;
3
4
import jwt from 'jsonwebtoken' ;
4
5
6
+ const config = getConfig ( ) ;
7
+
5
8
const server = fastify ( ) ;
6
9
void server . register ( fastifyFormBody ) ;
7
10
8
- const realm = 'bookyp' ; // TODO: add way to load realm name from config
9
-
10
- // TODO: add way to load users from config
11
- const users = [
12
- {
13
- id : '1' ,
14
- username : 'toni' ,
15
- email : 'toni@test.com' ,
16
- name : 'Toni Tester' ,
17
- } ,
18
- {
19
- id : '2' ,
20
- username : 'alice' ,
21
- email : 'alice@wonderland.org' ,
22
- name : 'Alice Wonderland' ,
23
- } ,
24
- {
25
- id : '3' ,
26
- username : 'herbert' ,
27
- email : 'her@bert.de' ,
28
- name : 'Herbert' ,
29
- } ,
30
- ] ;
31
-
32
11
const jwtSecret = 'mySuperDuperSecret' ;
33
12
34
13
const randomString = ( ) => ( Math . random ( ) + 1 ) . toString ( 36 ) . substring ( 7 ) ;
35
14
36
15
let sessions : { code : string ; user_id : string ; access_token ?: string } [ ] = [ ] ;
37
16
38
- server . get ( `/auth/realms/${ realm } /protocol/openid-connect/auth` , async ( request , reply ) => {
17
+ server . get ( `/auth/realms/${ config . realm } /protocol/openid-connect/auth` , async ( request , reply ) => {
39
18
const query = request . query as { redirect_uri : string ; error ?: string } ;
40
19
41
20
const template = `
@@ -84,7 +63,7 @@ server.get(`/auth/realms/${realm}/protocol/openid-connect/auth`, async (request,
84
63
<div>
85
64
<p>Please login with one of the following usernames:</p>
86
65
<ul>
87
- ${ users
66
+ ${ config . users
88
67
. map (
89
68
( user ) =>
90
69
`<li>
@@ -103,12 +82,13 @@ server.get(`/auth/realms/${realm}/protocol/openid-connect/auth`, async (request,
103
82
104
83
server . all ( '/do-login' , async ( request , reply ) => {
105
84
const query = ( request . body || request . query ) as { username : string ; redirect_uri : string } ;
106
- const user = users . find ( ( u ) => u . username === query . username ) || users . find ( ( u ) => u . email === query . username ) ;
85
+ const user =
86
+ config . users . find ( ( u ) => u . username === query . username ) || config . users . find ( ( u ) => u . email === query . username ) ;
107
87
const redirect_uri = query . redirect_uri ;
108
88
109
89
if ( ! user ) {
110
90
await reply . redirect (
111
- `/auth/realms/${ realm } /protocol/openid-connect/auth?error=invalid_credentials&redirect_uri=${ redirect_uri } ` ,
91
+ `/auth/realms/${ config . realm } /protocol/openid-connect/auth?error=invalid_credentials&redirect_uri=${ redirect_uri } ` ,
112
92
) ;
113
93
return ;
114
94
}
@@ -119,7 +99,7 @@ server.all('/do-login', async (request, reply) => {
119
99
await reply . redirect ( `${ redirect_uri } ?session_state=${ sessionState } &code=${ code } ` ) ;
120
100
} ) ;
121
101
122
- server . post ( `/auth/realms/${ realm } /protocol/openid-connect/token` , async ( request , reply ) => {
102
+ server . post ( `/auth/realms/${ config . realm } /protocol/openid-connect/token` , async ( request , reply ) => {
123
103
const body = request . body as {
124
104
grant_type : string ;
125
105
code : string ;
@@ -139,7 +119,7 @@ server.post(`/auth/realms/${realm}/protocol/openid-connect/token`, async (reques
139
119
const payload = {
140
120
sub : session . user_id , // TODO check if valid (seems to work somehow)
141
121
typ : 'Bearer' ,
142
- aud : realm ,
122
+ aud : config . realm ,
143
123
} ;
144
124
145
125
const accessToken = jwt . sign ( payload , jwtSecret , { expiresIn : '1h' } ) ;
@@ -152,15 +132,15 @@ server.post(`/auth/realms/${realm}/protocol/openid-connect/token`, async (reques
152
132
} ;
153
133
} ) ;
154
134
155
- server . get ( `/auth/realms/${ realm } /protocol/openid-connect/userinfo` , ( request ) => {
135
+ server . get ( `/auth/realms/${ config . realm } /protocol/openid-connect/userinfo` , ( request ) => {
156
136
const headers = request . headers as { authorization : string } ;
157
137
const access_token = headers . authorization . replace ( 'Bearer ' , '' ) ;
158
138
const payload = jwt . verify ( access_token , jwtSecret ) as { sub : string } ;
159
139
const userId = payload . sub ;
160
- return users . find ( ( s ) => s . id === userId ) ;
140
+ return config . users . find ( ( s ) => s . id === userId ) ;
161
141
} ) ;
162
142
163
- server . get ( `/auth/realms/${ realm } /protocol/openid-connect/logout` , async ( request , reply ) => {
143
+ server . get ( `/auth/realms/${ config . realm } /protocol/openid-connect/logout` , async ( request , reply ) => {
164
144
const query = request . query as { redirect_uri : string } ;
165
145
await reply . redirect ( query . redirect_uri ) ;
166
146
} ) ;
0 commit comments