UNPKG

@shopify/shopify-app-express

Version:

Shopify Express Middleware - to simplify the building of Shopify Apps with Express

47 lines (44 loc) 1.82 kB
'use strict'; function redirectOutOfApp({ api, config, }) { return function redirectOutOfApp({ req, res, redirectUri, shop }) { if ((!api.config.isEmbeddedApp && isFetchRequest(req)) || req.headers.authorization?.match(/Bearer (.*)/)) { appBridgeHeaderRedirect(config, res, redirectUri); } else if (req.query.embedded === '1') { exitIframeRedirect(config, req, res, redirectUri, shop); } else { serverSideRedirect(config, res, redirectUri, shop); } }; } function appBridgeHeaderRedirect(config, res, redirectUri) { config.logger.debug(`Redirecting: request has bearer token, returning headers to ${redirectUri}`); res.status(403); res.append('Access-Control-Expose-Headers', [ 'X-Shopify-Api-Request-Failure-Reauthorize', 'X-Shopify-Api-Request-Failure-Reauthorize-Url', ]); res.header('X-Shopify-API-Request-Failure-Reauthorize', '1'); res.header('X-Shopify-API-Request-Failure-Reauthorize-Url', redirectUri); res.end(); } function exitIframeRedirect(config, req, res, redirectUri, shop) { config.logger.debug(`Redirecting: request is embedded, using exitiframe path to ${redirectUri}`, { shop }); const queryParams = new URLSearchParams({ ...req.query, shop, redirectUri, }).toString(); res.redirect(`${config.exitIframePath}?${queryParams}`); } function serverSideRedirect(config, res, redirectUri, shop) { config.logger.debug(`Redirecting: request is at top level, going to ${redirectUri} `, { shop }); res.redirect(redirectUri); } function isFetchRequest(req) { return req.xhr || req.headers['sec-fetch-dest'] === 'empty'; } exports.redirectOutOfApp = redirectOutOfApp; //# sourceMappingURL=redirect-out-of-app.js.map