refresh-token.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const tokenService = require('../helpers/jwt')
  2. const { respondWithError } = require('../provider/error')
  3. const logger = require('../logger')
  4. // https://www.dropboxforum.com/t5/Dropbox-API-Support-Feedback/Get-refresh-token-from-access-token/td-p/596739
  5. // https://developers.dropbox.com/oauth-guide
  6. // https://github.com/simov/grant/issues/149
  7. async function refreshToken (req, res, next) {
  8. const { providerName } = req.params
  9. const { key: clientId, secret: clientSecret } = req.companion.options.providerOptions[providerName]
  10. const providerTokens = req.companion.allProvidersTokens[providerName]
  11. // not all providers have refresh tokens
  12. if (providerTokens.refreshToken == null) {
  13. res.sendStatus(401)
  14. return
  15. }
  16. try {
  17. const data = await req.companion.provider.refreshToken({
  18. clientId, clientSecret, refreshToken: providerTokens.refreshToken,
  19. })
  20. const newAllProvidersTokens = {
  21. ...req.companion.allProvidersTokens,
  22. [providerName]: {
  23. ...providerTokens,
  24. accessToken: data.accessToken,
  25. },
  26. }
  27. req.companion.allProvidersTokens = newAllProvidersTokens
  28. req.companion.providerTokens = newAllProvidersTokens[providerName]
  29. logger.debug(`Generating refreshed auth token for provider ${providerName}`, null, req.id)
  30. const uppyAuthToken = tokenService.generateEncryptedAuthToken(
  31. req.companion.allProvidersTokens, req.companion.options.secret,
  32. )
  33. tokenService.addToCookiesIfNeeded(req, res, uppyAuthToken)
  34. res.send({ uppyAuthToken })
  35. } catch (err) {
  36. if (respondWithError(err, res)) return
  37. next(err)
  38. }
  39. }
  40. module.exports = refreshToken