@scayle/storefront-core
Version:
Collection of essential utilities to work with the Storefront API
74 lines (73 loc) • 2.51 kB
JavaScript
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" }
);