diff --git a/backend/src/helpers/integration.ts b/backend/src/helpers/integration.ts index 148ed511b..fbbc2f807 100644 --- a/backend/src/helpers/integration.ts +++ b/backend/src/helpers/integration.ts @@ -72,7 +72,7 @@ interface Update { if (!integration) throw IntegrationNotFoundError(); const integrationAuth = await IntegrationAuth - .findById(integrationId) + .findById(integration.integrationAuth) .select( '+refreshCiphertext +refreshIV +refreshTag +accessCiphertext +accessIV +accessTag +accessExpiresAt' ); diff --git a/backend/src/helpers/integrationAuth.ts b/backend/src/helpers/integrationAuth.ts index 0b4556d4b..c169fb799 100644 --- a/backend/src/helpers/integrationAuth.ts +++ b/backend/src/helpers/integrationAuth.ts @@ -34,19 +34,21 @@ import { validateServiceAccountClientForWorkspace } from '../helpers/serviceAcco */ const validateClientForIntegrationAuth = async ({ authData, - integrationId, - acceptedRoles + integrationAuthId, + acceptedRoles, + attachAccessToken }: { authData: { authMode: string; authPayload: IUser | IServiceAccount | IServiceTokenData; }; - integrationId: Types.ObjectId; + integrationAuthId: Types.ObjectId; acceptedRoles: Array<'admin' | 'member'>; + attachAccessToken?: boolean; }) => { const integrationAuth = await IntegrationAuth - .findById(integrationId) + .findById(integrationAuthId) .populate<{ workspace: IWorkspace }>('workspace') .select( '+refreshCiphertext +refreshIV +refreshTag +accessCiphertext +accessIV +accessTag +accessExpiresAt' @@ -54,9 +56,12 @@ import { validateServiceAccountClientForWorkspace } from '../helpers/serviceAcco if (!integrationAuth) throw IntegrationAuthNotFoundError(); - const accessToken = (await IntegrationService.getIntegrationAuthAccess({ - integrationAuthId: integrationAuth._id - })).accessToken; + let accessToken; + if (attachAccessToken) { + accessToken = (await IntegrationService.getIntegrationAuthAccess({ + integrationAuthId: integrationAuth._id + })).accessToken; + } if (authData.authMode === AUTH_MODE_JWT && authData.authPayload instanceof User) { await validateUserClientForWorkspace({ diff --git a/backend/src/middleware/requireIntegrationAuth.ts b/backend/src/middleware/requireIntegrationAuth.ts index c93d3e690..bcde94f34 100644 --- a/backend/src/middleware/requireIntegrationAuth.ts +++ b/backend/src/middleware/requireIntegrationAuth.ts @@ -18,10 +18,8 @@ const requireIntegrationAuth = ({ acceptedRoles: Array<'admin' | 'member'>; }) => { return async (req: Request, res: Response, next: NextFunction) => { - // integration authorization middleware - const { integrationId } = req.params; - + const { integration, accessToken } = await validateClientForIntegration({ authData: req.authData, integrationId: new Types.ObjectId(integrationId), diff --git a/backend/src/middleware/requireIntegrationAuthorizationAuth.ts b/backend/src/middleware/requireIntegrationAuthorizationAuth.ts index 735df57ed..af1eb1a53 100644 --- a/backend/src/middleware/requireIntegrationAuthorizationAuth.ts +++ b/backend/src/middleware/requireIntegrationAuthorizationAuth.ts @@ -27,11 +27,12 @@ const requireIntegrationAuthorizationAuth = ({ }) => { return async (req: Request, res: Response, next: NextFunction) => { const { integrationAuthId } = req[location]; - + const { integrationAuth, accessToken } = await validateClientForIntegrationAuth({ authData: req.authData, - integrationId: new Types.ObjectId(integrationAuthId), - acceptedRoles + integrationAuthId: new Types.ObjectId(integrationAuthId), + acceptedRoles, + attachAccessToken }); if (integrationAuth) { diff --git a/backend/src/middleware/requireMembershipAuth.ts b/backend/src/middleware/requireMembershipAuth.ts index d06c0bda8..851230371 100644 --- a/backend/src/middleware/requireMembershipAuth.ts +++ b/backend/src/middleware/requireMembershipAuth.ts @@ -30,15 +30,15 @@ const requireMembershipAuth = ({ res: Response, next: NextFunction ) => { - const { membershipId } = req[locationMembershipId]; - - req.targetMembership = await validateClientForMembership({ - authData: req.authData, - membershipId: new Types.ObjectId(membershipId), - acceptedRoles - }); - - return next(); + const { membershipId } = req[locationMembershipId]; + + req.targetMembership = await validateClientForMembership({ + authData: req.authData, + membershipId: new Types.ObjectId(membershipId), + acceptedRoles + }); + + return next(); } } diff --git a/docs/images/integrations-supabase-authorization.png b/docs/images/integrations-supabase-authorization.png new file mode 100644 index 000000000..d6daab30c Binary files /dev/null and b/docs/images/integrations-supabase-authorization.png differ diff --git a/docs/images/integrations-supabase-create.png b/docs/images/integrations-supabase-create.png new file mode 100644 index 000000000..b6c2cd35d Binary files /dev/null and b/docs/images/integrations-supabase-create.png differ diff --git a/docs/images/integrations-supabase-dashboard.png b/docs/images/integrations-supabase-dashboard.png new file mode 100644 index 000000000..4908cfc5a Binary files /dev/null and b/docs/images/integrations-supabase-dashboard.png differ diff --git a/docs/images/integrations-supabase-token.png b/docs/images/integrations-supabase-token.png new file mode 100644 index 000000000..00a3c0b20 Binary files /dev/null and b/docs/images/integrations-supabase-token.png differ diff --git a/docs/images/integrations-supabase.png b/docs/images/integrations-supabase.png new file mode 100644 index 000000000..60808a232 Binary files /dev/null and b/docs/images/integrations-supabase.png differ diff --git a/docs/images/integrations.png b/docs/images/integrations.png index 234a842b3..fc6593143 100644 Binary files a/docs/images/integrations.png and b/docs/images/integrations.png differ diff --git a/docs/integrations/cicd/circleci.mdx b/docs/integrations/cicd/circleci.mdx index 7b9298f4b..58b8ae3ff 100644 --- a/docs/integrations/cicd/circleci.mdx +++ b/docs/integrations/cicd/circleci.mdx @@ -1,6 +1,6 @@ --- title: "CircleCI" -description: "How to automatically sync secrets from Infisical into your CircleCI project." +description: "How to sync secrets from Infisical to CircleCI" --- Prerequisites: diff --git a/docs/integrations/cicd/githubactions.mdx b/docs/integrations/cicd/githubactions.mdx index 8f93d8162..5ecf68d03 100644 --- a/docs/integrations/cicd/githubactions.mdx +++ b/docs/integrations/cicd/githubactions.mdx @@ -1,6 +1,6 @@ --- title: "GitHub Actions" -description: "How to automatically sync secrets from Infisical into your GitHub Actions." +description: "How to sync secrets from Infisical to GitHub Actions" --- diff --git a/docs/integrations/cicd/gitlab.mdx b/docs/integrations/cicd/gitlab.mdx index f52afe99f..8a5432272 100644 --- a/docs/integrations/cicd/gitlab.mdx +++ b/docs/integrations/cicd/gitlab.mdx @@ -1,6 +1,6 @@ --- title: "GitLab" -description: "How to automatically sync secrets from Infisical into GitLab." +description: "How to sync secrets from Infisical to GitLab" --- Prerequisites: diff --git a/docs/integrations/cicd/travisci.mdx b/docs/integrations/cicd/travisci.mdx index 5509ffc7a..79737a2d8 100644 --- a/docs/integrations/cicd/travisci.mdx +++ b/docs/integrations/cicd/travisci.mdx @@ -1,6 +1,6 @@ --- title: "Travis CI" -description: "How to automatically sync secrets from Infisical to your Travis CI repository." +description: "How to sync secrets from Infisical to Travis CI" --- Prerequisites: diff --git a/docs/integrations/cloud/aws-parameter-store.mdx b/docs/integrations/cloud/aws-parameter-store.mdx index 1bb6c40c9..63fd1e1c6 100644 --- a/docs/integrations/cloud/aws-parameter-store.mdx +++ b/docs/integrations/cloud/aws-parameter-store.mdx @@ -1,6 +1,6 @@ --- title: "AWS Parameter Store" -description: "How to automatically sync secrets from Infisical to your AWS Parameter Store." +description: "How to sync secrets from Infisical to AWS Parameter Store" --- Prerequisites: diff --git a/docs/integrations/cloud/aws-secret-manager.mdx b/docs/integrations/cloud/aws-secret-manager.mdx index 9b282c527..a798ae820 100644 --- a/docs/integrations/cloud/aws-secret-manager.mdx +++ b/docs/integrations/cloud/aws-secret-manager.mdx @@ -1,6 +1,6 @@ --- title: "AWS Secret Manager" -description: "How to automatically sync secrets from Infisical to your AWS Secret Manager." +description: "How to sync secrets from Infisical to AWS Secret Manager" --- Prerequisites: diff --git a/docs/integrations/cloud/azure-key-vault.mdx b/docs/integrations/cloud/azure-key-vault.mdx index 3b23f4d52..90c630666 100644 --- a/docs/integrations/cloud/azure-key-vault.mdx +++ b/docs/integrations/cloud/azure-key-vault.mdx @@ -1,6 +1,6 @@ --- title: "Azure Key Vault" -description: "How to automatically sync secrets from Infisical into your Azure Key Vault." +description: "How to sync secrets from Infisical to Azure Key Vault" --- Prerequisites: diff --git a/docs/integrations/cloud/flyio.mdx b/docs/integrations/cloud/flyio.mdx index 86d6c5421..283c54176 100644 --- a/docs/integrations/cloud/flyio.mdx +++ b/docs/integrations/cloud/flyio.mdx @@ -1,6 +1,6 @@ --- title: "Fly.io" -description: "How to automatically sync secrets from Infisical into your Fly.io project." +description: "How to sync secrets from Infisical to Fly.io" --- Prerequisites: diff --git a/docs/integrations/cloud/heroku.mdx b/docs/integrations/cloud/heroku.mdx index 9d0c26789..f3c58d27e 100644 --- a/docs/integrations/cloud/heroku.mdx +++ b/docs/integrations/cloud/heroku.mdx @@ -1,6 +1,6 @@ --- title: "Heroku" -description: "How to automatically sync secrets from Infisical into your Heroku project." +description: "How to sync secrets from Infisical to Heroku" --- Prerequisites: diff --git a/docs/integrations/cloud/netlify.mdx b/docs/integrations/cloud/netlify.mdx index b6dc36ba0..acd037417 100644 --- a/docs/integrations/cloud/netlify.mdx +++ b/docs/integrations/cloud/netlify.mdx @@ -1,6 +1,6 @@ --- title: "Netlify" -description: "How to automatically sync secrets from Infisical into your Netlify project." +description: "How to sync secrets from Infisical to Netlify" --- diff --git a/docs/integrations/cloud/railway.mdx b/docs/integrations/cloud/railway.mdx index 5ebf8fc1d..e19cfb626 100644 --- a/docs/integrations/cloud/railway.mdx +++ b/docs/integrations/cloud/railway.mdx @@ -1,6 +1,6 @@ --- title: "Railway" -description: "How to automatically sync secrets from Infisical into your Railway projects and services" +description: "How to sync secrets from Infisical to Railway" --- Prerequisites: diff --git a/docs/integrations/cloud/render.mdx b/docs/integrations/cloud/render.mdx index 95890e92a..290e39012 100644 --- a/docs/integrations/cloud/render.mdx +++ b/docs/integrations/cloud/render.mdx @@ -1,6 +1,6 @@ --- title: "Render" -description: "How to automatically sync secrets from Infisical into your Render project." +description: "How to sync secrets from Infisical to Render" --- Prerequisites: diff --git a/docs/integrations/cloud/supabase.mdx b/docs/integrations/cloud/supabase.mdx index 895d1578c..14c787f75 100644 --- a/docs/integrations/cloud/supabase.mdx +++ b/docs/integrations/cloud/supabase.mdx @@ -1,20 +1,44 @@ --- title: "Supabase" -description: "How to automatically sync secrets from Infisical into your Supabase project." +description: "How to sync secrets from Infisical to Supabase" --- + + The Supabase integration is useful if your Supabase project uses sensitive-information such as [environment variables in edge functions](https://supabase.com/docs/guides/functions/secrets). + + Synced envars can be accessed in edge functions using Deno's built-in handler: `Deno.env.get(MY_SECRET_NAME)`. + + Prerequisites: +- Have an account and project set up at [Supabase](https://supabase.com/) - Set up and add envars to [Infisical Cloud](https://app.infisical.com) -Note somewhere that envars will be accessible in edge functions etc. - ## Navigate to your project's integrations tab ![integrations](../../images/integrations.png) -## Enter your Supabase API +## Enter your Supabase Access Token +Obtain a Supabase Access Token in your Supabase [Account > Access Tokens](https://app.supabase.com/account/tokens). +![integrations supabase dashboard](../../images/integrations-supabase-dashboard.png) +![integrations supabase token](../../images/integrations-supabase-token.png) +Press on the Supabase tile and input your Supabase Access Token to grant Infisical access to your Supabase account. -## Start integration \ No newline at end of file +![integrations supabase authorization](../../images/integrations-supabase-authorization.png) + + + If this is your project's first cloud integration, then you'll have to grant + Infisical access to your project's environment variables. Although this step + breaks E2EE, it's necessary for Infisical to sync the environment variables to + the cloud platform. + + +## Start integration + +Select which Infisical environment secrets you want to sync to which Supabase project. Lastly, press create integration to start syncing secrets to Supabase. + +![integrations supabase create](../../images/integrations-supabase-create.png) + +![integrations supabase](../../images/integrations-supabase.png) \ No newline at end of file diff --git a/docs/integrations/cloud/vercel.mdx b/docs/integrations/cloud/vercel.mdx index af20c60cf..fb265ec98 100644 --- a/docs/integrations/cloud/vercel.mdx +++ b/docs/integrations/cloud/vercel.mdx @@ -1,6 +1,6 @@ --- title: "Vercel" -description: "How to automatically sync secrets from Infisical into your Vercel project." +description: "How to sync secrets from Infisical to Vercel" --- Prerequisites: diff --git a/docs/integrations/overview.mdx b/docs/integrations/overview.mdx index bf5c5224d..dcbdf44b8 100644 --- a/docs/integrations/overview.mdx +++ b/docs/integrations/overview.mdx @@ -18,9 +18,9 @@ Missing an integration? Throw in a [request](https://github.com/Infisical/infisi | [Vercel](/integrations/cloud/vercel) | Cloud | Available | | [Netlify](/integrations/cloud/netlify) | Cloud | Available | | [Render](/integrations/cloud/render) | Cloud | Available | -| [Railway](/integrations/cloud/railway) | Cloud | Available | +| [Railway](/integrations/cloud/railway) | Cloud | Available | | [Fly.io](/integrations/cloud/flyio) | Cloud | Available | -| [Supabase](/integrations/cloud/flyio) | Cloud | Available | +| [Supabase](/integrations/cloud/supabase) | Cloud | Available | | [AWS Parameter Store](/integrations/cloud/aws-parameter-store) | Cloud | Available | | [AWS Secret Manager](/integrations/cloud/aws-secret-manager) | Cloud | Available | | [Azure Key Vault](/integrations/cloud/azure-key-vault) | Cloud | Available | diff --git a/docs/integrations/platforms/kubernetes.mdx b/docs/integrations/platforms/kubernetes.mdx index 959a4fce2..5ea3967d9 100644 --- a/docs/integrations/platforms/kubernetes.mdx +++ b/docs/integrations/platforms/kubernetes.mdx @@ -1,6 +1,6 @@ --- title: 'Kubernetes' -description: "This page explains how to use Infisical to inject secrets into Kubernetes clusters." +description: "How to use Infisical to inject secrets into Kubernetes clusters." --- ![title](../../images/k8-diagram.png) diff --git a/docs/mint.json b/docs/mint.json index 165ce6862..850809a4f 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -151,6 +151,7 @@ "integrations/cloud/render", "integrations/cloud/railway", "integrations/cloud/flyio", + "integrations/cloud/supabase", "integrations/cloud/azure-key-vault", "integrations/cicd/githubactions", "integrations/cicd/gitlab", diff --git a/frontend/src/pages/api/integrations/DeleteIntegration.ts b/frontend/src/pages/api/integrations/DeleteIntegration.ts index a16c629a3..ae401984c 100644 --- a/frontend/src/pages/api/integrations/DeleteIntegration.ts +++ b/frontend/src/pages/api/integrations/DeleteIntegration.ts @@ -19,7 +19,6 @@ const deleteIntegration = ({ integrationId }: Props) => if (res && res.status === 200) { return (await res.json()).integration; } - console.log('Failed to delete an integration'); return undefined; });