|
|
@@ -11,28 +11,54 @@ const hashToken = async token => {
|
|
11
|
11
|
}
|
|
12
|
12
|
}
|
|
13
|
13
|
|
|
|
14
|
+const createToken = (data, expiration = 600) => {
|
|
|
15
|
+ const key = process.env.APP_SECRET
|
|
|
16
|
+ const obj = {}
|
|
|
17
|
+
|
|
|
18
|
+ Object.assign(obj, { ...data })
|
|
|
19
|
+ return JWT.sign(obj, key, { expiresIn: expiration })
|
|
|
20
|
+}
|
|
|
21
|
+
|
|
|
22
|
+const validateToken = token => {
|
|
|
23
|
+ const key = process.env.APP_SECRET
|
|
|
24
|
+ try {
|
|
|
25
|
+ return JWT.verify(token, key)
|
|
|
26
|
+ } catch (err) {
|
|
|
27
|
+ return { payload: null, message: err.message }
|
|
|
28
|
+ }
|
|
|
29
|
+}
|
|
|
30
|
+
|
|
14
|
31
|
module.exports = options => {
|
|
15
|
32
|
return {
|
|
16
|
33
|
key: options.jwtKey,
|
|
17
|
34
|
verifyOptions: {
|
|
18
|
35
|
algorithms: ['HS256'],
|
|
19
|
36
|
},
|
|
20
|
|
- // TODO: Always check rawAccessToken, if it fails, we check the session, if
|
|
21
|
|
- // session is valid, then we reissue it if session is NOT valid, DELETE
|
|
22
|
|
- // the session (and kick user back to login)
|
|
23
|
|
- // TODO: set up cron job to occassionaly clean up activeSessions
|
|
|
37
|
+ // TODO: Naming conventions need to be reversed again??
|
|
24
|
38
|
validate: async (decoded, request, h) => {
|
|
25
|
39
|
const accessTokenFromHeaders = request.headers.authorization
|
|
26
|
40
|
const hashedAccessTokenFromHeaders = await hashToken(
|
|
27
|
41
|
accessTokenFromHeaders,
|
|
28
|
42
|
)
|
|
29
|
|
- const accessToken =
|
|
30
|
|
- request.server.app.activeSessions[hashedAccessTokenFromHeaders]
|
|
31
|
|
- .accessToken
|
|
32
|
|
- const sessionToken =
|
|
|
43
|
+ const activeSession =
|
|
33
|
44
|
request.server.app.activeSessions[hashedAccessTokenFromHeaders]
|
|
34
|
|
- .sessionToken
|
|
35
|
|
- console.log('sessionToken from jwt strategy :=>', sessionToken)
|
|
|
45
|
+ if (!activeSession)
|
|
|
46
|
+ throw new Error(
|
|
|
47
|
+ `No session found for ${hashedAccessTokenFromHeaders}`,
|
|
|
48
|
+ )
|
|
|
49
|
+
|
|
|
50
|
+ const accessToken = activeSession.accessToken
|
|
|
51
|
+ const sessionToken = activeSession.sessionToken
|
|
|
52
|
+ const validatedAccessToken = validateToken(accessToken)
|
|
|
53
|
+ const validatedSessionToken = validateToken(sessionToken)
|
|
|
54
|
+ if (!validatedSessionToken.payload) {
|
|
|
55
|
+ console.log('sessionToken no longer valid, reissuing... ')
|
|
|
56
|
+ activeSession.sessionToken = createToken(
|
|
|
57
|
+ { payload: validatedAccessToken.payload },
|
|
|
58
|
+ // NOTE: Expiration of new sessionToken set for 200 seconds (testing)
|
|
|
59
|
+ 100,
|
|
|
60
|
+ )
|
|
|
61
|
+ }
|
|
36
|
62
|
try {
|
|
37
|
63
|
const validatedJwt = JWT.verify(
|
|
38
|
64
|
accessToken,
|
|
|
@@ -40,7 +66,6 @@ module.exports = options => {
|
|
40
|
66
|
)
|
|
41
|
67
|
return { isValid: true, credentials: validatedJwt.email }
|
|
42
|
68
|
} catch (err) {
|
|
43
|
|
- console.error('ERROR :=>', err)
|
|
44
|
69
|
return { isValid: false, error: err.message }
|
|
45
|
70
|
}
|
|
46
|
71
|
},
|