diff --git a/apps/blog-next/.env.example b/apps/blog-next/.env.example
index d382e1b..023507f 100644
--- a/apps/blog-next/.env.example
+++ b/apps/blog-next/.env.example
@@ -48,9 +48,9 @@ WORKOS_REDIRECT_URI=
WORKOS_SESSION_COOKIE=
CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
-CLERK_JWT_KEY=
CLERK_API_URL=
CLERK_FRONTEND_API=
+CLERK_REDIRECT_URI=
CLERK_SESSION_COOKIE=
BROADCAST_CONNECTION=holo
diff --git a/apps/blog-next/app/api/auth/clerk/callback/route.ts b/apps/blog-next/app/api/auth/clerk/callback/route.ts
new file mode 100644
index 0000000..edc32ac
--- /dev/null
+++ b/apps/blog-next/app/api/auth/clerk/callback/route.ts
@@ -0,0 +1,10 @@
+import { completeClerkAuth } from '@holo-js/auth-clerk'
+
+export async function GET(request: Request) {
+ const result = await completeClerkAuth(request)
+ if (!result.ok) {
+ return Response.redirect(new URL(`/login?error=${encodeURIComponent(result.code)}`, request.url))
+ }
+
+ return Response.redirect(new URL('/admin', request.url))
+}
diff --git a/apps/blog-next/app/api/auth/clerk/login/route.ts b/apps/blog-next/app/api/auth/clerk/login/route.ts
new file mode 100644
index 0000000..c130bdd
--- /dev/null
+++ b/apps/blog-next/app/api/auth/clerk/login/route.ts
@@ -0,0 +1,5 @@
+import { loginWithClerk } from '@holo-js/auth-clerk'
+
+export async function GET(request: Request) {
+ return await loginWithClerk(request)
+}
diff --git a/apps/blog-next/app/api/auth/clerk/logout/route.ts b/apps/blog-next/app/api/auth/clerk/logout/route.ts
new file mode 100644
index 0000000..68a0d19
--- /dev/null
+++ b/apps/blog-next/app/api/auth/clerk/logout/route.ts
@@ -0,0 +1,10 @@
+import { logoutWithClerk } from '@holo-js/auth-clerk'
+
+export async function POST(request: Request) {
+ const result = await logoutWithClerk(request)
+ if (!result.ok) {
+ return Response.json(result, { status: 422 })
+ }
+
+ return Response.redirect(result.url, 303)
+}
diff --git a/apps/blog-next/app/api/auth/clerk/register/route.ts b/apps/blog-next/app/api/auth/clerk/register/route.ts
new file mode 100644
index 0000000..92861da
--- /dev/null
+++ b/apps/blog-next/app/api/auth/clerk/register/route.ts
@@ -0,0 +1,5 @@
+import { registerWithClerk } from '@holo-js/auth-clerk'
+
+export async function GET(request: Request) {
+ return await registerWithClerk(request)
+}
diff --git a/apps/blog-next/app/auth-nav.tsx b/apps/blog-next/app/auth-nav.tsx
index 61dcd30..82a76be 100644
--- a/apps/blog-next/app/auth-nav.tsx
+++ b/apps/blog-next/app/auth-nav.tsx
@@ -64,6 +64,9 @@ export function AuthNav() {
+
>
)
}
diff --git a/apps/blog-next/app/login/page.tsx b/apps/blog-next/app/login/page.tsx
index 5b5c7f2..ca3826a 100644
--- a/apps/blog-next/app/login/page.tsx
+++ b/apps/blog-next/app/login/page.tsx
@@ -48,6 +48,7 @@ export default function LoginPage() {
Continue with Google
Continue with GitHub
Continue with WorkOS
+ Continue with Clerk
+
Login
diff --git a/apps/blog-nuxt/app/pages/login/index.vue b/apps/blog-nuxt/app/pages/login/index.vue
index 3b6cc2d..4a12680 100644
--- a/apps/blog-nuxt/app/pages/login/index.vue
+++ b/apps/blog-nuxt/app/pages/login/index.vue
@@ -36,6 +36,7 @@ const form = useForm(loginForm, {
Continue with Google
Continue with GitHub
Continue with WorkOS
+ Continue with Clerk
diff --git a/apps/blog-nuxt/config/auth.ts b/apps/blog-nuxt/config/auth.ts
index b54d336..c1ec02f 100644
--- a/apps/blog-nuxt/config/auth.ts
+++ b/apps/blog-nuxt/config/auth.ts
@@ -65,13 +65,14 @@ export default defineAuthConfig({
},
// Add a dedicated guard and provider if WorkOS users should resolve through a different model.
clerk: {
+ provider: env('AUTH_CLERK_PROVIDER', 'app'),
app: {
publishableKey: env('CLERK_PUBLISHABLE_KEY'),
secretKey: env('CLERK_SECRET_KEY'),
- jwtKey: env('CLERK_JWT_KEY'),
apiUrl: env('CLERK_API_URL'),
frontendApi: env('CLERK_FRONTEND_API'),
- sessionCookie: env('CLERK_SESSION_COOKIE', "__session"),
+ redirectUri: env('CLERK_REDIRECT_URI'),
+ sessionCookie: env('CLERK_SESSION_COOKIE', '__session'),
},
},
// Add a dedicated guard and provider if Clerk users should resolve through a different model.
diff --git a/apps/blog-nuxt/server/api/auth/clerk/callback.get.ts b/apps/blog-nuxt/server/api/auth/clerk/callback.get.ts
new file mode 100644
index 0000000..c33a61a
--- /dev/null
+++ b/apps/blog-nuxt/server/api/auth/clerk/callback.get.ts
@@ -0,0 +1,12 @@
+import { completeClerkAuth } from '@holo-js/auth-clerk'
+import { sendRedirect } from 'h3'
+
+export default defineEventHandler(async (event) => {
+ const result = await completeClerkAuth(event)
+ if (!result.ok) {
+ const errCode = result.code ?? 'unknown_error'
+ return await sendRedirect(event, `/login?error=${encodeURIComponent(errCode)}`, 303)
+ }
+
+ return await sendRedirect(event, '/admin', 303)
+})
diff --git a/apps/blog-nuxt/server/api/auth/clerk/login.get.ts b/apps/blog-nuxt/server/api/auth/clerk/login.get.ts
new file mode 100644
index 0000000..0d860cf
--- /dev/null
+++ b/apps/blog-nuxt/server/api/auth/clerk/login.get.ts
@@ -0,0 +1,5 @@
+import { loginWithClerk } from '@holo-js/auth-clerk'
+
+export default defineEventHandler(async (event) => {
+ return await loginWithClerk(event)
+})
diff --git a/apps/blog-nuxt/server/api/auth/clerk/logout.post.ts b/apps/blog-nuxt/server/api/auth/clerk/logout.post.ts
new file mode 100644
index 0000000..ce54e6a
--- /dev/null
+++ b/apps/blog-nuxt/server/api/auth/clerk/logout.post.ts
@@ -0,0 +1,14 @@
+import { logoutWithClerk } from '@holo-js/auth-clerk'
+import { createError, sendRedirect } from 'h3'
+
+export default defineEventHandler(async (event) => {
+ const result = await logoutWithClerk(event)
+ if (!result.ok) {
+ throw createError({
+ statusCode: 422,
+ statusMessage: result.message,
+ })
+ }
+
+ return await sendRedirect(event, result.url, 303)
+})
diff --git a/apps/blog-nuxt/server/api/auth/clerk/register.get.ts b/apps/blog-nuxt/server/api/auth/clerk/register.get.ts
new file mode 100644
index 0000000..6c792c3
--- /dev/null
+++ b/apps/blog-nuxt/server/api/auth/clerk/register.get.ts
@@ -0,0 +1,5 @@
+import { registerWithClerk } from '@holo-js/auth-clerk'
+
+export default defineEventHandler(async (event) => {
+ return await registerWithClerk(event)
+})
diff --git a/apps/blog-sveltekit/.env.example b/apps/blog-sveltekit/.env.example
index d382e1b..023507f 100644
--- a/apps/blog-sveltekit/.env.example
+++ b/apps/blog-sveltekit/.env.example
@@ -48,9 +48,9 @@ WORKOS_REDIRECT_URI=
WORKOS_SESSION_COOKIE=
CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
-CLERK_JWT_KEY=
CLERK_API_URL=
CLERK_FRONTEND_API=
+CLERK_REDIRECT_URI=
CLERK_SESSION_COOKIE=
BROADCAST_CONNECTION=holo
diff --git a/apps/blog-sveltekit/config/auth.ts b/apps/blog-sveltekit/config/auth.ts
index b54d336..c1ec02f 100644
--- a/apps/blog-sveltekit/config/auth.ts
+++ b/apps/blog-sveltekit/config/auth.ts
@@ -65,13 +65,14 @@ export default defineAuthConfig({
},
// Add a dedicated guard and provider if WorkOS users should resolve through a different model.
clerk: {
+ provider: env('AUTH_CLERK_PROVIDER', 'app'),
app: {
publishableKey: env('CLERK_PUBLISHABLE_KEY'),
secretKey: env('CLERK_SECRET_KEY'),
- jwtKey: env('CLERK_JWT_KEY'),
apiUrl: env('CLERK_API_URL'),
frontendApi: env('CLERK_FRONTEND_API'),
- sessionCookie: env('CLERK_SESSION_COOKIE', "__session"),
+ redirectUri: env('CLERK_REDIRECT_URI'),
+ sessionCookie: env('CLERK_SESSION_COOKIE', '__session'),
},
},
// Add a dedicated guard and provider if Clerk users should resolve through a different model.
diff --git a/apps/blog-sveltekit/src/routes/+layout.svelte b/apps/blog-sveltekit/src/routes/+layout.svelte
index 87a94ab..da96cef 100644
--- a/apps/blog-sveltekit/src/routes/+layout.svelte
+++ b/apps/blog-sveltekit/src/routes/+layout.svelte
@@ -45,6 +45,9 @@
+
{:else}
Login
Register
diff --git a/apps/blog-sveltekit/src/routes/api/auth/clerk/callback/+server.ts b/apps/blog-sveltekit/src/routes/api/auth/clerk/callback/+server.ts
new file mode 100644
index 0000000..1d3e054
--- /dev/null
+++ b/apps/blog-sveltekit/src/routes/api/auth/clerk/callback/+server.ts
@@ -0,0 +1,11 @@
+import { redirect, type RequestHandler } from '@sveltejs/kit'
+import { completeClerkAuth } from '@holo-js/auth-clerk'
+
+export const GET = (async (event) => {
+ const result = await completeClerkAuth(event)
+ if (!result.ok) {
+ throw redirect(303, `/login?error=${encodeURIComponent(result.code)}`)
+ }
+
+ throw redirect(303, '/admin')
+}) satisfies RequestHandler
diff --git a/apps/blog-sveltekit/src/routes/api/auth/clerk/login/+server.ts b/apps/blog-sveltekit/src/routes/api/auth/clerk/login/+server.ts
new file mode 100644
index 0000000..1953979
--- /dev/null
+++ b/apps/blog-sveltekit/src/routes/api/auth/clerk/login/+server.ts
@@ -0,0 +1,6 @@
+import { loginWithClerk } from '@holo-js/auth-clerk'
+import type { RequestHandler } from './$types'
+
+export const GET = (async (event) => {
+ return await loginWithClerk(event)
+}) satisfies RequestHandler
diff --git a/apps/blog-sveltekit/src/routes/api/auth/clerk/logout/+server.ts b/apps/blog-sveltekit/src/routes/api/auth/clerk/logout/+server.ts
new file mode 100644
index 0000000..6bc08f9
--- /dev/null
+++ b/apps/blog-sveltekit/src/routes/api/auth/clerk/logout/+server.ts
@@ -0,0 +1,11 @@
+import { redirect, type RequestHandler } from '@sveltejs/kit'
+import { logoutWithClerk } from '@holo-js/auth-clerk'
+
+export const POST = (async (event) => {
+ const result = await logoutWithClerk(event)
+ if (!result.ok) {
+ return Response.json(result, { status: 422 })
+ }
+
+ throw redirect(303, result.url)
+}) satisfies RequestHandler
diff --git a/apps/blog-sveltekit/src/routes/api/auth/clerk/register/+server.ts b/apps/blog-sveltekit/src/routes/api/auth/clerk/register/+server.ts
new file mode 100644
index 0000000..341fe7c
--- /dev/null
+++ b/apps/blog-sveltekit/src/routes/api/auth/clerk/register/+server.ts
@@ -0,0 +1,6 @@
+import { registerWithClerk } from '@holo-js/auth-clerk'
+import type { RequestHandler } from './$types'
+
+export const GET = (async (event) => {
+ return await registerWithClerk(event)
+}) satisfies RequestHandler
diff --git a/apps/blog-sveltekit/src/routes/login/+page.svelte b/apps/blog-sveltekit/src/routes/login/+page.svelte
index 4a47248..0d10494 100644
--- a/apps/blog-sveltekit/src/routes/login/+page.svelte
+++ b/apps/blog-sveltekit/src/routes/login/+page.svelte
@@ -31,6 +31,7 @@
Continue with Google
Continue with GitHub
Continue with WorkOS
+ Continue with Clerk