UNPKG

@shopify/shopify-app-express

Version:

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

83 lines (80 loc) 3.36 kB
import { privacyTopics, BotActivityDetected, CookieNotFound, InvalidOAuthError } from '@shopify/shopify-api'; import { redirectToAuth } from '../redirect-to-auth.mjs'; async function authCallback({ req, res, api, config, }) { try { const callbackResponse = await api.auth.callback({ rawRequest: req, rawResponse: res, }); config.logger.debug('Callback is valid, storing session', { shop: callbackResponse.session.shop, isOnline: callbackResponse.session.isOnline, }); await config.sessionStorage.storeSession(callbackResponse.session); // If this is an offline OAuth process, register webhooks if (!callbackResponse.session.isOnline) { await registerWebhooks(config, api, callbackResponse.session); } // If we're completing an offline OAuth process, immediately kick off the online one if (config.useOnlineTokens && !callbackResponse.session.isOnline) { config.logger.debug('Completing offline token OAuth, redirecting to online token OAuth', { shop: callbackResponse.session.shop }); await redirectToAuth({ req, res, api, config, isOnline: true }); return false; } res.locals.shopify = { ...res.locals.shopify, session: callbackResponse.session, }; config.logger.debug('Completed OAuth callback', { shop: callbackResponse.session.shop, isOnline: callbackResponse.session.isOnline, }); return true; } catch (error) { config.logger.error(`Failed to complete OAuth with error: ${error}`); await handleCallbackError(req, res, api, config, error); } return false; } async function registerWebhooks(config, api, session) { config.logger.debug('Registering webhooks', { shop: session.shop }); const responsesByTopic = await api.webhooks.register({ session }); for (const topic in responsesByTopic) { if (!Object.prototype.hasOwnProperty.call(responsesByTopic, topic)) { continue; } for (const response of responsesByTopic[topic]) { if (!response.success && !privacyTopics.includes(topic)) { const result = response.result; if (result.errors) { config.logger.error(`Failed to register ${topic} webhook: ${result.errors[0].message}`, { shop: session.shop }); } else { config.logger.error(`Failed to register ${topic} webhook: ${JSON.stringify(result.data)}`, { shop: session.shop }); } } } } } async function handleCallbackError(req, res, api, config, error) { switch (true) { case error instanceof InvalidOAuthError: res.status(400); res.send(error.message); break; case error instanceof CookieNotFound: await redirectToAuth({ req, res, api, config }); break; case error instanceof BotActivityDetected: res.status(410); res.send(error.message); break; default: res.status(500); res.send(error.message); break; } } export { authCallback }; //# sourceMappingURL=auth-callback.mjs.map