Kaynağa Gözat

:construction: Set up separate routes for session/access token creation

juan_spike
tomit4 2 yıl önce
ebeveyn
işleme
ab55182c6f

+ 4
- 2
backend/lib/plugins/user.js Dosyayı Görüntüle

@@ -14,7 +14,8 @@ const UserLoginRoute = require('../routes/user/login')
14 14
 const UserSignupRoute = require('../routes/user/signup')
15 15
 const UserEmailRoute = require('../routes/user/email.js')
16 16
 const UserVerifyEmailRoute = require('../routes/user/verifyemail.js')
17
-const UserGetJWTRoute = require('../routes/user/getjwt.js')
17
+const UserGetSessionRoute = require('../routes/user/getsession.js')
18
+const UserGetAccessRoute = require('../routes/user/getaccess.js')
18 19
 const UserValidateSessionRoute = require('../routes/user/validatesession.js')
19 20
 const UserCheckEmailRegistry = require('../routes/user/check-email-registry.js')
20 21
 const UserByEmail = require('../routes/user/user-by-email.js')
@@ -57,7 +58,8 @@ module.exports = {
57 58
         await server.route(UserProfilesListRoute)
58 59
         await server.route(UserEmailRoute)
59 60
         await server.route(UserVerifyEmailRoute)
60
-        await server.route(UserGetJWTRoute)
61
+        await server.route(UserGetSessionRoute)
62
+        await server.route(UserGetAccessRoute)
61 63
         await server.route(UserValidateSessionRoute)
62 64
         await server.route(UserCheckEmailRegistry)
63 65
         await server.route(UserByEmail)

backend/lib/routes/user/getjwt.js → backend/lib/routes/user/getaccess.js Dosyayı Görüntüle

@@ -3,18 +3,18 @@
3 3
 const Joi = require('joi')
4 4
 
5 5
 const pluginConfig = {
6
-    handlerType: 'email',
6
+    handlerType: 'authentication',
7 7
     docs: {
8 8
         get: {
9
-            description: 'gets jwt after verifying email',
10
-            notes: 'Gets jwt after validating email',
9
+            description: 'gets access token for authentication',
10
+            notes: 'Gets access token for authentication',
11 11
         },
12 12
     },
13 13
 }
14 14
 
15 15
 module.exports = {
16 16
     method: 'POST',
17
-    path: '/getjwt',
17
+    path: '/getaccess',
18 18
     options: {
19 19
         ...pluginConfig.docs.get,
20 20
         tags: ['api'],
@@ -26,7 +26,11 @@ module.exports = {
26 26
         handler: async function (request, h) {
27 27
             const { userService } = request.server.services()
28 28
             const res = request.payload
29
-            const token = await userService.createToken(res)
29
+            const token = await userService.createToken({
30
+                ...res,
31
+                // NOTE: Set Expiration Time for Access Token Here
32
+                expires: 60 * 3,
33
+            })
30 34
             try {
31 35
                 const response = h.response({
32 36
                     ok: true,
@@ -50,7 +54,7 @@ module.exports = {
50 54
         },
51 55
         response: {
52 56
             // TODO: change back to accommodate new h.response return values
53
-            schema: Joi.any().label('get_jwt_res'),
57
+            schema: Joi.any().label('get_access_res'),
54 58
             failAction: 'log',
55 59
         },
56 60
     },

+ 61
- 0
backend/lib/routes/user/getsession.js Dosyayı Görüntüle

@@ -0,0 +1,61 @@
1
+'use strict'
2
+
3
+const Joi = require('joi')
4
+
5
+const pluginConfig = {
6
+    handlerType: 'authentication',
7
+    docs: {
8
+        get: {
9
+            description: 'gets session token for authentication',
10
+            notes: 'Gets session token for authentication',
11
+        },
12
+    },
13
+}
14
+
15
+module.exports = {
16
+    method: 'POST',
17
+    path: '/getsession',
18
+    options: {
19
+        ...pluginConfig.docs.get,
20
+        tags: ['api'],
21
+        auth: false,
22
+        cors: {
23
+            headers: ['Authorization'],
24
+            exposedHeaders: ['Authorization', 'Access-Control-Expose-Headers'],
25
+        },
26
+        handler: async function (request, h) {
27
+            const { userService } = request.server.services()
28
+            const res = request.payload
29
+            const token = await userService.createToken({
30
+                ...res,
31
+                // NOTE: Set Expiration Time for Session Token Here
32
+                expires: 60 * 3,
33
+            })
34
+            try {
35
+                const response = h.response({
36
+                    ok: true,
37
+                    handler: pluginConfig.handlerType,
38
+                    data: token,
39
+                })
40
+                response.header('Authorization', token)
41
+                return response
42
+            } catch (err) {
43
+                return {
44
+                    ok: false,
45
+                    handler: pluginConfig.handlerType,
46
+                    data: {
47
+                        error: err,
48
+                    },
49
+                }
50
+            }
51
+        },
52
+        validate: {
53
+            failAction: 'log',
54
+        },
55
+        response: {
56
+            // TODO: change back to accommodate new h.response return values
57
+            schema: Joi.any().label('get_session_res'),
58
+            failAction: 'log',
59
+        },
60
+    },
61
+}

+ 1
- 1
backend/lib/routes/user/validatesession.js Dosyayı Görüntüle

@@ -20,7 +20,7 @@ module.exports = {
20 20
     options: {
21 21
         ...pluginConfig.docs.get,
22 22
         tags: ['api'],
23
-        auth: false,
23
+        auth: false, // set to jwt strategy
24 24
         cors: true,
25 25
         handler: async function (request, h) {
26 26
             const sessionToken = request.params.sessionToken

+ 2
- 5
backend/lib/services/user.js Dosyayı Görüntüle

@@ -222,10 +222,6 @@ module.exports = class UserService extends Schmervice.Service {
222 222
      * @param {User} user
223 223
      * @returns {Token}
224 224
      */
225
-    // TODO: Put this logic in the routes, NOT here
226
-    // createSessionToken(user, payload)
227
-    // createAccessToken()
228
-    //
229 225
     createToken(data) {
230 226
         const key = this.server.registrations['main-app-plugin'].options.jwtKey
231 227
         const obj = {}
@@ -253,8 +249,9 @@ module.exports = class UserService extends Schmervice.Service {
253 249
      * @param {User} user
254 250
      * @returns {Token}
255 251
      */
252
+    // TODO: Move this ino the auth strategies
256 253
     validateToken(token) {
257
-        const key = this.server.registrations['main-app-plugin'].options.jwtKey
254
+        const key = this.server.registrations['main-app-plugin'].options.jwtKey // mysecret
258 255
         try {
259 256
             return JWT.verify(token, key)
260 257
         } catch (err) {

+ 1
- 2
frontend/src/components/onboarding/Auth.vue Dosyayı Görüntüle

@@ -67,9 +67,8 @@ export default {
67 67
                 )
68 68
         },
69 69
         async getSessionToken(payload) {
70
-            return await this.authenticator.getJwt({
70
+            return await this.authenticator.getSessionToken({
71 71
                 payload,
72
-                expires: 60 * 3,
73 72
             })
74 73
         },
75 74
         async signupNewUser(userInfo) {

+ 5
- 2
frontend/src/services/auth.service.js Dosyayı Görüntüle

@@ -14,8 +14,11 @@ class Authenticator {
14 14
         const isVerified = await db.get(`/user/verify/${hashedEmail}`)
15 15
         return isVerified.hashesMatch
16 16
     }
17
-    async getJwt(req) {
18
-        return await db.post('/user/getjwt', req, true)
17
+    async getSessionToken(req) {
18
+        return await db.post('/user/getsession', req, true)
19
+    }
20
+    async getAccessToken(req) {
21
+        return await db.post('/user/getaccess', req, true)
19 22
     }
20 23
     async validateSession(sessionToken) {
21 24
         return await db.get(`/user/validatesession/${sessionToken}`)

+ 2
- 2
frontend/src/views/OnboardingView.vue Dosyayı Görüntüle

@@ -45,8 +45,6 @@ import stepViews from '@/components/onboarding'
45 45
 import SurveyCompleteView from './SurveyCompleteView.vue'
46 46
 let sessionToken = null
47 47
 let accessToken = null
48
-// import savesurveybyprofileid - call it on submit
49
-// paginate to save every steps answers
50 48
 
51 49
 /* BRIAN'S NOTE: 
52 50
 I'll need help here. The logic is getting confusing.
@@ -60,6 +58,7 @@ I'll need help here. The logic is getting confusing.
60 58
             anotherhashedEmailString: expiration_in_milliseconds,
61 59
         }
62 60
 
61
+        TODO: jwt, hashedEmail, cookie expiration should be the same
63 62
     3.  The session, access tokens all have jwt expirations as well as cookie expirations
64 63
 
65 64
     4.  Additionally, we have an expiration on each hashedEmail string...
@@ -116,6 +115,7 @@ export default {
116 115
         }
117 116
         // TODO: EVERY ROUTE WE HIT AFTER THIS HAS TO BE AUTHENTICATED
118 117
         // ACCESS TOKEN WORKS
118
+        // START PROTECTING ALL ROUTES
119 119
         if (this.emailIsRegistered) {
120 120
             const user = await fetchUserByEmail(this.userEmail)
121 121
             const userId = user.user_id

+ 1
- 2
frontend/src/views/VerifyView.vue Dosyayı Görüntüle

@@ -42,9 +42,8 @@ export default {
42 42
         },
43 43
         // QUESTION: This will likely be needed in OnboardingView.vue
44 44
         async getAccessToken(payload) {
45
-            const accessToken = await this.authenticator.getJwt({
45
+            const accessToken = await this.authenticator.getAccessToken({
46 46
                 payload,
47
-                expires: 60 * 3,
48 47
             })
49 48
             document.cookie = `siimee_access=${accessToken}; max-age=600; path=/; secure`
50 49
         },

Loading…
İptal
Kaydet