@dataroadinc/setup-auth
Version:
CLI tool and programmatic API for automated OAuth setup across cloud platforms
92 lines (91 loc) • 3.77 kB
JavaScript
import { DEFAULT_CALLBACK_PATHS } from "../constants/defaults.js";
export async function getRedirectOptions(options) {
const envProjectId = process.env.GCP_OAUTH_PROJECT_ID;
if (!envProjectId) {
throw new Error("GCP_OAUTH_PROJECT_ID is not set. Make sure it is set in your environment variables.");
}
const envClientId = process.env.GCP_OAUTH_CLIENT_ID?.replace(/\.apps\.googleusercontent\.com$/, "");
if (!envClientId) {
throw new Error("GCP_OAUTH_CLIENT_ID is not set. Make sure it is set in your environment variables.");
}
console.log("Using configuration from environment variables");
return {
gcpOauthProjectId: envProjectId,
clientId: envClientId,
additionalUrls: process.env.ADDITIONAL_REDIRECT_URLS?.split(","),
wildcardPatterns: getDefaultWildcardPatterns(options.platform || "vercel", options.oauthProvider || "google"),
};
}
export function buildRedirectUriList(options) {
const { redirectOptions, deploymentUrl, platform, oauthProvider, callbackPath, } = options;
if (!platform) {
throw new Error("Platform is not set. Make sure it is set in your environment variables.");
}
if (!oauthProvider) {
throw new Error("Provider is not set. Make sure it is set in your environment variables.");
}
const redirectUris = new Set();
const providerCallbackPath = callbackPath ||
DEFAULT_CALLBACK_PATHS[oauthProvider] ||
`/api/auth/callback/${oauthProvider}`;
const productionUrl = getPlatformDeploymentUrl(platform, providerCallbackPath);
if (productionUrl) {
redirectUris.add(productionUrl);
}
if (deploymentUrl) {
const fullUrl = deploymentUrl.startsWith("https://")
? `${deploymentUrl}${providerCallbackPath}`
: `https://${deploymentUrl}${providerCallbackPath}`;
redirectUris.add(fullUrl);
console.log(`Added current deployment URL: ${fullUrl}`);
}
if (redirectOptions.additionalUrls) {
for (const url of redirectOptions.additionalUrls) {
if (url && url.trim()) {
redirectUris.add(url.trim());
console.log(`Added additional URL: ${url.trim()}`);
}
}
}
if (redirectOptions.wildcardPatterns) {
for (const pattern of redirectOptions.wildcardPatterns) {
if (pattern && pattern.trim()) {
redirectUris.add(pattern.trim());
console.log(`Added wildcard pattern: ${pattern.trim()}`);
}
}
}
return Array.from(redirectUris);
}
function getPlatformDeploymentUrl(platform, callbackPath) {
const projectName = process.env.EKG_PROJECT_NAME ||
process.env.PROJECT_NAME ||
"your-project-name";
switch (platform) {
case "vercel":
return `https://${projectName}.vercel.app${callbackPath}`;
case "netlify":
return `https://${projectName}.netlify.app${callbackPath}`;
case "opennext":
return process.env.PRODUCTION_URL
? `${process.env.PRODUCTION_URL}${callbackPath}`
: null;
default:
return null;
}
}
function getDefaultWildcardPatterns(platform, oauthProvider) {
const projectName = process.env.EKG_PROJECT_NAME ||
process.env.PROJECT_NAME ||
"your-project-name";
const callbackPath = DEFAULT_CALLBACK_PATHS[oauthProvider] ||
`/api/auth/callback/${oauthProvider}`;
switch (platform) {
case "vercel":
return [`https://${projectName}-*${callbackPath}`];
case "netlify":
return [`https://deploy-preview-*--${projectName}${callbackPath}`];
default:
return [];
}
}