@uppy/companion
Version:
OAuth helper and remote fetcher for Uppy's (https://uppy.io) extensible file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Dropbox and Google Drive, S3 and more :dog:
51 lines (50 loc) • 2.3 kB
JavaScript
;
/**
* oAuth callback. Encrypts the access token and sends the new token with the response,
*/
const serialize = require('serialize-javascript');
const tokenService = require('../helpers/jwt');
const logger = require('../logger');
const oAuthState = require('../helpers/oauth-state');
const closePageHtml = (origin) => `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script>
// if window.opener is nullish, we want the following line to throw to avoid
// the window closing without informing the user.
window.opener.postMessage(${serialize({ error: true })}, ${serialize(origin)})
window.close()
</script>
</head>
<body>Authentication failed.</body>
</html>`;
/**
*
* @param {object} req
* @param {object} res
* @param {Function} next
*/
module.exports = function callback(req, res, next) {
const { providerName } = req.params;
const grant = req.session.grant || {};
const grantDynamic = oAuthState.getGrantDynamicFromRequest(req);
const origin = grantDynamic.state &&
oAuthState.getFromState(grantDynamic.state, 'origin', req.companion.options.secret);
if (!grant.response?.access_token) {
logger.debug(`Did not receive access token for provider ${providerName}`, null, req.id);
logger.debug(grant.response, 'callback.oauth.resp', req.id);
return res.status(400).send(closePageHtml(origin));
}
const { access_token: accessToken, refresh_token: refreshToken } = grant.response;
req.companion.providerUserSession = {
accessToken,
refreshToken, // might be undefined for some providers
...req.companion.providerClass.grantDynamicToUserSession({ grantDynamic }),
};
logger.debug(`Generating auth token for provider ${providerName}. refreshToken: ${refreshToken ? 'yes' : 'no'}`, null, req.id);
const uppyAuthToken = tokenService.generateEncryptedAuthToken({ [providerName]: req.companion.providerUserSession }, req.companion.options.secret, req.companion.providerClass.authStateExpiry);
tokenService.addToCookiesIfNeeded(req, res, uppyAuthToken, req.companion.providerClass.authStateExpiry);
return res.redirect(req.companion.buildURL(`/${providerName}/send-token?uppyAuthToken=${uppyAuthToken}`, true));
};