Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

validate-session.js 3.6KB

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