diff --git a/apps/link/app/(login)/login/_components/Login.tsx b/apps/link/app/(login)/login/_components/Login.tsx index 3207dfd..0df2147 100644 --- a/apps/link/app/(login)/login/_components/Login.tsx +++ b/apps/link/app/(login)/login/_components/Login.tsx @@ -14,6 +14,7 @@ import { Google as GoogleIcon, Microsoft as MicrosoftIcon, Key as KeyIcon, + VpnKey as KeycloakIcon, } from "@mui/icons-material"; import { signIn, getProviders } from "next-auth/react"; import Image from "next/image"; @@ -200,6 +201,21 @@ export const Login: FC = ({ session, baseURL }) => { )} + {provider === "keycloak" && ( + + + signIn("keycloak", { + callbackUrl, + }) + } + > + + Sign in with Keycloak + + + )} {provider === "credentials" && ( diff --git a/apps/link/app/_lib/authentication.ts b/apps/link/app/_lib/authentication.ts index 6370038..49f2e07 100644 --- a/apps/link/app/_lib/authentication.ts +++ b/apps/link/app/_lib/authentication.ts @@ -11,6 +11,7 @@ import Google from "next-auth/providers/google"; import Credentials from "next-auth/providers/credentials"; import Apple from "next-auth/providers/apple"; import AzureADProvider from "next-auth/providers/azure-ad"; +import Keycloak from "next-auth/providers/keycloak"; import { createLogger } from "@link-stack/logger"; const logger = createLogger('link-authentication'); @@ -101,6 +102,18 @@ if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) { tenantId: process.env.AZURE_AD_TENANT_ID, }), ); +} else if ( + process.env.KEYCLOAK_CLIENT_ID && + process.env.KEYCLOAK_CLIENT_SECRET && + process.env.KEYCLOAK_ISSUER +) { + providers.push( + Keycloak({ + clientId: process.env.KEYCLOAK_CLIENT_ID, + clientSecret: process.env.KEYCLOAK_CLIENT_SECRET, + issuer: process.env.KEYCLOAK_ISSUER, + }), + ); } else { providers.push( Credentials({