Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

validate-session.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. 'use strict'
  2. const Joi = require('joi')
  3. const pluginConfig = {
  4. handlerType: 'jwt',
  5. docs: {
  6. get: {
  7. description: 'validates session token for each step of survey',
  8. notes: 'Validates session token for each step of survey',
  9. },
  10. },
  11. }
  12. const validators = {
  13. post: {
  14. payload: Joi.object({
  15. token: Joi.string(),
  16. }),
  17. },
  18. }
  19. module.exports = {
  20. method: 'POST',
  21. path: '/validate-session',
  22. options: {
  23. ...pluginConfig.docs.get,
  24. tags: ['api'],
  25. auth: false,
  26. cors: {
  27. headers: ['Authorization', 'Content-Type'],
  28. exposedHeaders: ['Authorization', 'Access-Control-Expose-Headers'],
  29. },
  30. handler: async function (request, h) {
  31. const hashedSessionToken = request.payload.token
  32. const { userService, profileService } = request.server.services()
  33. try {
  34. if (!hashedSessionToken) {
  35. throw new Error('[API] hashedSessionToken not passed!')
  36. }
  37. const userSession =
  38. userService.activeSessions[hashedSessionToken]
  39. if (!userSession) {
  40. console.error('--- userService.activeSessions ---')
  41. console.error(userService.activeSessions)
  42. console.error(hashedSessionToken)
  43. console.error('--- userService.activeSessions ---')
  44. throw new Error(
  45. '[API] hashedSessionToken not in activeSessions registry!',
  46. )
  47. }
  48. if (!userSession.emailWasRespondedTo) {
  49. throw new Error(
  50. `[API] Email was never responded to! ${userSession.emailWasRespondedTo}`,
  51. )
  52. }
  53. if (!userSession.sessionToken) {
  54. throw new Error(
  55. `[API] No session token in userSession ${userSession.sessionToken}`,
  56. )
  57. }
  58. const sessionTokenIsValid = userService.validateToken(
  59. userSession.sessionToken,
  60. )
  61. if (!sessionTokenIsValid) {
  62. throw new Error(
  63. `[API] Could not validate session token: ${userSession.sessionToken}`,
  64. )
  65. }
  66. if (!userSession?.email)
  67. throw new Error(
  68. `[API] Could not validate token based on payload: ${request.payload}`,
  69. )
  70. const user = await userService.findByUserEmail(
  71. userSession.email,
  72. )
  73. const type = user.is_poster === 1 ? 'poster' : 'seeker'
  74. const profiles = await profileService.getCompleteProfilesFor(
  75. user.user_id,
  76. type,
  77. )
  78. // TODO: handle user with multiple profiles...
  79. const profileId = profiles[0].profile_id
  80. return {
  81. ok: true,
  82. handler: pluginConfig.handlerType,
  83. data: {
  84. ...userSession,
  85. profileId: profileId,
  86. },
  87. }
  88. } catch (err) {
  89. return {
  90. ok: false,
  91. handler: pluginConfig.handlerType,
  92. data: { error: err.message },
  93. }
  94. }
  95. },
  96. validate: validators.post,
  97. response: {
  98. schema: Joi.object({
  99. ok: Joi.bool(),
  100. handler: Joi.string(),
  101. data: Joi.object(),
  102. }).label('validate_session_res'),
  103. failAction: 'log',
  104. },
  105. },
  106. }