4
4
5
5
require ( 'supererror' ) ( { splatchError : true } ) ;
6
6
7
- var PORT = process . env . PORT || 3000 ;
8
- var BIND_ADDRESS = process . env . BIND_ADDRESS || '0.0.0.0' ;
7
+ const PORT = process . env . VITE_DEV_PORT || process . env . PORT || 3000 ;
8
+ const BIND_ADDRESS = process . env . BIND_ADDRESS || '0.0.0.0' ;
9
9
10
10
if ( ! process . env . CLOUDRON_APP_ORIGIN ) {
11
11
console . log ( 'No CLOUDRON_APP_ORIGIN env var set. Falling back to http://localhost' ) ;
12
12
}
13
13
14
+ const APP_ORIGIN = process . env . CLOUDRON_APP_ORIGIN || `http://localhost:${ PORT } ` ;
15
+
14
16
var express = require ( 'express' ) ,
15
17
json = require ( 'body-parser' ) . json ,
16
18
config = require ( './src/config.js' ) ,
17
19
cors = require ( 'cors' ) ,
18
20
session = require ( 'express-session' ) ,
19
21
MongoStore = require ( 'connect-mongo' ) ,
20
22
multer = require ( 'multer' ) ,
23
+ oidc = require ( 'express-openid-connect' ) ,
21
24
routes = require ( './src/routes.js' ) ,
22
25
lastmile = require ( 'connect-lastmile' ) ,
23
26
logic = require ( './src/logic.js' ) ,
@@ -35,6 +38,15 @@ var memoryUpload = multer({ storage: multer.memoryStorage({}) }).any();
35
38
36
39
router . del = router . delete ;
37
40
41
+ router . get ( '/api/login' , function ( req , res ) {
42
+ res . oidc . login ( {
43
+ returnTo : '/' ,
44
+ authorizationParams : {
45
+ redirect_uri : `${ APP_ORIGIN } /api/callback` ,
46
+ }
47
+ } ) ;
48
+ } ) ;
49
+
38
50
router . post ( '/api/things' , routes . auth , routes . add ) ;
39
51
router . get ( '/api/things' , routes . auth , routes . getAll ) ;
40
52
router . get ( '/api/things/:id' , routes . auth , routes . get ) ;
@@ -52,9 +64,6 @@ router.get ('/api/settings', routes.auth, routes.settingsGet);
52
64
router . get ( '/api/export' , routes . auth , routes . exportThings ) ;
53
65
router . post ( '/api/import' , routes . auth , diskUpload , routes . importThings ) ;
54
66
55
- router . post ( '/api/login' , routes . login ) ;
56
- router . get ( '/api/logout' , routes . auth , routes . logout ) ;
57
-
58
67
router . get ( '/api/profile' , routes . auth , routes . profile ) ;
59
68
60
69
// public apis
@@ -90,6 +99,73 @@ app.use(session({
90
99
cookie : { sameSite : 'strict' } ,
91
100
store : MongoStore . create ( { mongoUrl : config . databaseUrl } )
92
101
} ) ) ;
102
+
103
+ if ( process . env . CLOUDRON_OIDC_ISSUER ) {
104
+ app . use ( oidc . auth ( {
105
+ issuerBaseURL : process . env . CLOUDRON_OIDC_ISSUER ,
106
+ baseURL : APP_ORIGIN ,
107
+ clientID : process . env . CLOUDRON_OIDC_CLIENT_ID ,
108
+ clientSecret : process . env . CLOUDRON_OIDC_CLIENT_SECRET ,
109
+ secret : 'FIXME this secret' ,
110
+ authorizationParams : {
111
+ response_type : 'code' ,
112
+ scope : 'openid profile email'
113
+ } ,
114
+ authRequired : false ,
115
+ routes : {
116
+ callback : '/api/callback' ,
117
+ login : false ,
118
+ logout : '/api/logout'
119
+ }
120
+ } ) ) ;
121
+ } else {
122
+ // mock oidc
123
+ console . log ( 'CLOUDRON_OIDC_ISSUER is not set, using mock OpenID for development' ) ;
124
+
125
+ app . use ( ( req , res , next ) => {
126
+ res . oidc = {
127
+ login ( options ) {
128
+ res . writeHead ( 200 , { 'Content-Type' : 'text/html' } )
129
+ res . write ( require ( 'fs' ) . readFileSync ( __dirname + '/oidc_develop_user_select.html' , 'utf8' ) . replaceAll ( 'REDIRECT_URI' , options . authorizationParams . redirect_uri ) ) ;
130
+ res . end ( )
131
+ }
132
+ } ;
133
+
134
+ req . oidc = {
135
+ user : { } ,
136
+ isAuthenticated ( ) {
137
+ return ! ! req . session . username ;
138
+ }
139
+ } ;
140
+
141
+ if ( req . session . username ) {
142
+ req . oidc . user = {
143
+ sub : req . session . username ,
144
+ family_name : 'Cloudron' ,
145
+ given_name : req . session . username . toUpperCase ( ) ,
146
+ locale : 'en-US' ,
147
+ name : 'Cloudron ' + req . session . username . toUpperCase ( ) ,
148
+ preferred_username : req . session . username ,
149
+ email : req . session . username + '@cloudron.local' ,
150
+ email_verified : true
151
+ } ;
152
+ }
153
+
154
+ next ( ) ;
155
+ } ) ;
156
+
157
+ app . use ( '/api/callback' , ( req , res ) => {
158
+ console . log ( req . query )
159
+ req . session . username = req . query . username ;
160
+ res . redirect ( `http://localhost:${ PORT } /` ) ;
161
+ } ) ;
162
+
163
+ app . use ( '/api/logout' , ( req , res ) => {
164
+ req . session . username = null ;
165
+ res . status ( 200 ) . send ( { } ) ;
166
+ } ) ;
167
+ }
168
+
93
169
app . use ( router ) ;
94
170
app . use ( lastmile ( ) ) ;
95
171
0 commit comments