Implement SSO Sign-In Options: Add components for signing in with GitHub, Google, and SSO, enhancing user authentication methods. Update SSO settings to conditionally render based on enterprise features and improve the overall login experience on the homepage.

This commit is contained in:
Mauricio Siu
2026-01-30 22:28:17 -06:00
parent 66b4bf2c4e
commit f3d9960b7f
9 changed files with 326 additions and 213 deletions

View File

@@ -168,7 +168,6 @@ export const licenseKeyRouter = createTRPCRouter({
currentUser?.isValidEnterpriseLicense
);
}),
updateEnterpriseSettings: adminProcedure
.input(
z.object({

View File

@@ -1,6 +1,7 @@
import { ssoProvider } from "@dokploy/server/db/schema";
import { IS_CLOUD } from "@dokploy/server/constants";
import { member, ssoProvider } from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server";
import { and, eq } from "drizzle-orm";
import { and, asc, eq } from "drizzle-orm";
import { z } from "zod";
import {
createTRPCRouter,
@@ -10,14 +11,31 @@ import {
import { db } from "@/server/db";
export const ssoRouter = createTRPCRouter({
/** Public list of SSO providers for the login page (providerId + issuer only). */
listLoginProviders: publicProcedure.query(async () => {
const providers = await db.query.ssoProvider.findMany({
columns: { providerId: true, issuer: true },
showSignInWithSSO: publicProcedure.query(async () => {
if (IS_CLOUD) {
return true;
}
const owner = await db.query.member.findFirst({
where: eq(member.role, "owner"),
with: {
user: {
columns: {
enableEnterpriseFeatures: true,
isValidEnterpriseLicense: true,
},
},
},
orderBy: [asc(member.createdAt)],
});
return providers;
}),
if (!owner) {
return false;
}
return (
owner.user.enableEnterpriseFeatures && owner.user.isValidEnterpriseLicense
);
}),
listProviders: enterpriseProcedure.query(async ({ ctx }) => {
const providers = await db.query.ssoProvider.findMany({
where: eq(ssoProvider.userId, ctx.user.id),
@@ -33,7 +51,6 @@ export const ssoRouter = createTRPCRouter({
});
return providers;
}),
deleteProvider: enterpriseProcedure
.input(z.object({ providerId: z.string().min(1) }))
.mutation(async ({ ctx, input }) => {