UNPKG

@scayle/storefront-core

Version:

Collection of essential utilities to work with the Storefront API

74 lines (73 loc) 2.51 kB
import { SignJWT } from "jose"; import { ErrorResponse } from "../../../errors/index.mjs"; import { HttpStatusCode, HttpStatusMessage } from "../../../constants/index.mjs"; import { hasSession } from "../../../types/index.mjs"; import { getOAuthClient } from "../../../api/oauth.mjs"; import { postLogin } from "../session.mjs"; import { defineRpcHandler } from "../../../utils/index.mjs"; export const getExternalIdpRedirect = defineRpcHandler( async ({ queryParams, authUrlParameters }, context) => { if (!context.idp?.enabled) { return {}; } if (context.idp.idpKeys.length === 0) { return new ErrorResponse( HttpStatusCode.BAD_REQUEST, HttpStatusMessage.BAD_REQUEST, "No IDP keys are configured" ); } if (!context.idp.idpRedirectURL) { return new ErrorResponse( HttpStatusCode.BAD_REQUEST, HttpStatusMessage.BAD_REQUEST, "No IDP redirect url is configured" ); } const OAuthClient = getOAuthClient(context); const redirectUrl = new URL(context.idp.idpRedirectURL); if (queryParams) { for (const [key, value] of Object.entries(queryParams)) { redirectUrl.searchParams.set(key, value); } } const secret = new TextEncoder().encode(context.checkout.secret); const results = await Promise.all( context.idp.idpKeys.map(async (idpKey) => { const jwtPayload = await new SignJWT({ idpKey, callbackUrl: redirectUrl.toString(), clientId: OAuthClient.clientId.toString(), authUrlParameters }).setProtectedHeader({ alg: "HS256", typ: "JWT" }).setIssuedAt().setExpirationTime("2h").sign(secret); const url = new URL(`${OAuthClient.baseURL}/auth/external/redirect`); url.searchParams.set("shopId", `${context.shopId}`); url.searchParams.set("jwt", jwtPayload); return [idpKey, url.toString()]; }) ); return Object.fromEntries(results); }, { method: "GET" } ); export const handleIDPLoginCallback = defineRpcHandler( async (payload, context) => { if (!hasSession(context)) { return new ErrorResponse( HttpStatusCode.BAD_REQUEST, HttpStatusMessage.BAD_REQUEST, "No Session found" ); } const OAuthClient = getOAuthClient(context); const tokens = await OAuthClient.generateToken(payload.code); await postLogin(context, tokens); return { message: "success" }; }, { method: "POST" } );