您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

validate-session.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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
  32. const { userService, profileService } = request.server.services()
  33. try {
  34. if (!hashedSessionToken) {
  35. throw new Error('hashedSessionToken not passed!')
  36. }
  37. const userSession =
  38. userService.activeSessions[hashedSessionToken]
  39. if (!userSession) {
  40. throw new Error(
  41. 'hashedSessionToken not in activeSessions registry!',
  42. )
  43. }
  44. if (!userSession.emailWasRespondedTo) {
  45. throw new Error(
  46. `Email was never responded to! ${userSession.emailWasRespondedTo}`,
  47. )
  48. }
  49. if (!userSession.sessionToken) {
  50. throw new Error(
  51. `No session token in userSession ${userSession.sessionToken}`,
  52. )
  53. }
  54. const sessionTokenIsValid = userService.validateToken(
  55. userSession.sessionToken,
  56. )
  57. if (!sessionTokenIsValid) {
  58. throw new Error(
  59. `Could not validate session token: ${userSession.sessionToken}`,
  60. )
  61. }
  62. if (!userSession?.email)
  63. throw new Error(
  64. `Could not validate token based on payload: ${request.payload}`,
  65. )
  66. const user = await userService.findByUserEmail(
  67. userSession.email,
  68. )
  69. const type = user.is_poster === 1 ? 'poster' : 'seeker'
  70. const profiles = await profileService.getCompleteProfilesFor(
  71. user.user_id,
  72. type,
  73. )
  74. // TODO: handle user with multiple profiles...
  75. const profileId = profiles[0].profile_id
  76. return {
  77. ok: true,
  78. handler: pluginConfig.handlerType,
  79. data: {
  80. ...userSession,
  81. profileId: profileId,
  82. },
  83. }
  84. } catch (err) {
  85. return {
  86. ok: false,
  87. handler: pluginConfig.handlerType,
  88. data: { error: err.message },
  89. }
  90. }
  91. },
  92. validate: validators.post,
  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. }