auth.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import express from 'express'
  2. import { Socket } from 'socket.io'
  3. import { getAccessToken } from '@server/lib/auth/oauth-model'
  4. import { HttpStatusCode } from '../../shared/models/http/http-error-codes'
  5. import { logger } from '../helpers/logger'
  6. import { handleOAuthAuthenticate } from '../lib/auth/oauth'
  7. function authenticate (req: express.Request, res: express.Response, next: express.NextFunction) {
  8. handleOAuthAuthenticate(req, res)
  9. .then((token: any) => {
  10. res.locals.oauth = { token }
  11. res.locals.authenticated = true
  12. return next()
  13. })
  14. .catch(err => {
  15. logger.info('Cannot authenticate.', { err })
  16. return res.fail({
  17. status: err.status,
  18. message: 'Token is invalid',
  19. type: err.name
  20. })
  21. })
  22. }
  23. function authenticateSocket (socket: Socket, next: (err?: any) => void) {
  24. const accessToken = socket.handshake.query['accessToken']
  25. logger.debug('Checking socket access token %s.', accessToken)
  26. if (!accessToken) return next(new Error('No access token provided'))
  27. if (typeof accessToken !== 'string') return next(new Error('Access token is invalid'))
  28. getAccessToken(accessToken)
  29. .then(tokenDB => {
  30. const now = new Date()
  31. if (!tokenDB || tokenDB.accessTokenExpiresAt < now || tokenDB.refreshTokenExpiresAt < now) {
  32. return next(new Error('Invalid access token.'))
  33. }
  34. socket.handshake.auth.user = tokenDB.User
  35. return next()
  36. })
  37. .catch(err => logger.error('Cannot get access token.', { err }))
  38. }
  39. function authenticatePromise (req: express.Request, res: express.Response) {
  40. return new Promise<void>(resolve => {
  41. // Already authenticated? (or tried to)
  42. if (res.locals.oauth?.token.User) return resolve()
  43. if (res.locals.authenticated === false) {
  44. return res.fail({
  45. status: HttpStatusCode.UNAUTHORIZED_401,
  46. message: 'Not authenticated'
  47. })
  48. }
  49. authenticate(req, res, () => resolve())
  50. })
  51. }
  52. function optionalAuthenticate (req: express.Request, res: express.Response, next: express.NextFunction) {
  53. if (req.header('authorization')) return authenticate(req, res, next)
  54. res.locals.authenticated = false
  55. return next()
  56. }
  57. // ---------------------------------------------------------------------------
  58. export {
  59. authenticate,
  60. authenticateSocket,
  61. authenticatePromise,
  62. optionalAuthenticate
  63. }