You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jwt.js 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict'
  2. const JWT = require('jsonwebtoken')
  3. const crypto = require('crypto')
  4. const hashToken = async token => {
  5. const salt = process.env.APP_SESSION_SALT
  6. try {
  7. return crypto.createHmac('sha256', salt).update(token).digest('hex')
  8. } catch (err) {
  9. throw new Error(err.message)
  10. }
  11. }
  12. module.exports = options => {
  13. return {
  14. key: options.jwtKey,
  15. verifyOptions: {
  16. algorithms: ['HS256'],
  17. },
  18. // TODO: Always check rawAccessToken, if it fails, we check the session, if
  19. // session is valid, then we reissue it if session is NOT valid, DELETE
  20. // the session (and kick user back to login)
  21. // TODO: set up cron job to occassionaly clean up activeSessions
  22. validate: async (decoded, request, h) => {
  23. const accessTokenFromHeaders = request.headers.authorization
  24. const hashedAccessTokenFromHeaders = await hashToken(
  25. accessTokenFromHeaders,
  26. )
  27. const accessToken =
  28. request.server.app.activeSessions[hashedAccessTokenFromHeaders]
  29. .accessToken
  30. const sessionToken =
  31. request.server.app.activeSessions[hashedAccessTokenFromHeaders]
  32. .sessionToken
  33. console.log('sessionToken from jwt strategy :=>', sessionToken)
  34. try {
  35. const validatedJwt = JWT.verify(
  36. accessToken,
  37. process.env.APP_SECRET,
  38. )
  39. return { isValid: true, credentials: validatedJwt.email }
  40. } catch (err) {
  41. console.error('ERROR :=>', err)
  42. return { isValid: false, error: err.message }
  43. }
  44. },
  45. }
  46. }