@@ -10,7 +10,7 @@ const UserAccount = require('../models/user-account')
1010 * Models a Login request, a POST submit from a Login form with a username and
1111 * password. Used with authMethod of 'oidc'.
1212 *
13- * For usage example, see `handle ()` docstring , below.
13+ * For usage example, see `post ()` and `get()` docstrings , below.
1414 */
1515class LoginByPasswordRequest {
1616 /**
@@ -42,24 +42,36 @@ class LoginByPasswordRequest {
4242 }
4343
4444 /**
45- * Handles a Login request on behalf of a middleware handler. Usage:
45+ * Handles a Login GET request on behalf of a middleware handler. Usage:
4646 *
4747 * ```
48- * app.post('/login', (req, res, next) = {
49- * LoginByPasswordRequest.handle(req, res)
50- * .catch(next)
51- * })
48+ * app.get('/login', LoginByPasswordRequest.get)
5249 * ```
5350 *
5451 * @param req {IncomingRequest}
5552 * @param res {ServerResponse}
5653 *
57- * @throws {Error } HTTP 400 error if required parameters are missing, or
58- * if the user is not found or the password does not match.
54+ * @return {Promise }
55+ */
56+ static get ( req , res ) {
57+ const request = LoginByPasswordRequest . fromParams ( req , res )
58+
59+ request . renderView ( )
60+ }
61+
62+ /**
63+ * Handles a Login POST request on behalf of a middleware handler. Usage:
64+ *
65+ * ```
66+ * app.post('/login', LoginByPasswordRequest.post)
67+ * ```
68+ *
69+ * @param req {IncomingRequest}
70+ * @param res {ServerResponse}
5971 *
6072 * @return {Promise }
6173 */
62- static handle ( req , res ) {
74+ static post ( req , res ) {
6375 const request = LoginByPasswordRequest . fromParams ( req , res )
6476
6577 return LoginByPasswordRequest . login ( request )
@@ -97,7 +109,7 @@ class LoginByPasswordRequest {
97109 session : req . session ,
98110 userStore,
99111 accountManager,
100- authQueryParams : LoginByPasswordRequest . extractQueryParams ( body )
112+ authQueryParams : LoginByPasswordRequest . extractParams ( req )
101113 }
102114
103115 return new LoginByPasswordRequest ( options )
@@ -132,18 +144,25 @@ class LoginByPasswordRequest {
132144 * Initializes query params required by OIDC work flow from the request body.
133145 * Only authorized params are loaded, all others are discarded.
134146 *
135- * @param body {Object} Key/value hashmap, ie `req.body`.
147+ * @param req {IncomingRequest}
136148 *
137149 * @return {Object }
138150 */
139- static extractQueryParams ( body ) {
151+ static extractParams ( req ) {
152+ let params
153+ if ( req . method === 'POST' ) {
154+ params = req . body || { }
155+ } else {
156+ params = req . query || { }
157+ }
158+
140159 let extracted = { }
141160
142161 let paramKeys = LoginByPasswordRequest . AUTH_QUERY_PARAMS
143162 let value
144163
145164 for ( let p of paramKeys ) {
146- value = body [ p ]
165+ value = params [ p ]
147166 value = value === 'undefined' ? undefined : value
148167 extracted [ p ] = value
149168 }
@@ -153,8 +172,18 @@ class LoginByPasswordRequest {
153172
154173 error ( error ) {
155174 let res = this . response
156- let params = Object . assign ( { } , this . authQueryParams , { error : error . message } )
157- res . statusCode ( error . statusCode || 400 )
175+ let params = Object . assign ( { } , this . authQueryParams , { error : error . message } )
176+
177+ res . status ( error . statusCode || 400 )
178+
179+ res . render ( 'auth/login' , params )
180+ }
181+
182+ renderView ( ) {
183+ let res = this . response
184+ let params = Object . assign ( { } , this . authQueryParams ,
185+ { postRegisterUrl : this . postRegisterUrl ( ) } )
186+
158187 res . render ( 'auth/login' , params )
159188 }
160189
@@ -259,20 +288,45 @@ class LoginByPasswordRequest {
259288 return url . format ( authUrl )
260289 }
261290
262- /**
263- * Redirects the Login request to continue on the OIDC auth workflow.
264- */
265- redirectPostLogin ( validUser ) {
291+ postLoginUrl ( validUser ) {
266292 let uri
267293
268294 if ( this . authQueryParams [ 'redirect_uri' ] ) {
269295 // Login request is part of an app's auth flow
270296 uri = this . authorizeUrl ( )
271- } else {
297+ } else if ( validUser ) {
272298 // Login request is a user going to /login in browser
273299 uri = this . accountManager . accountUriFor ( validUser . username )
300+ } else {
301+ let host = this . accountManager . host
302+ uri = host . serverUri
303+ }
304+
305+ return uri
306+ }
307+
308+ postRegisterUrl ( ) {
309+ let uri
310+
311+ if ( this . authQueryParams [ 'redirect_uri' ] ) {
312+ // Login/register request is part of an app's auth flow
313+ uri = this . authorizeUrl ( )
314+ } else {
315+ let host = this . accountManager . host
316+ uri = host . serverUri
274317 }
275318
319+ uri = encodeURIComponent ( uri )
320+
321+ return uri
322+ }
323+
324+ /**
325+ * Redirects the Login request to continue on the OIDC auth workflow.
326+ */
327+ redirectPostLogin ( validUser ) {
328+ let uri = this . postLoginUrl ( validUser )
329+
276330 debug ( 'Login successful, redirecting to ' , uri )
277331
278332 this . response . redirect ( uri )
0 commit comments