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
{ event.preventDefault(); form.submit() }} style={{ display: 'grid', gap: '0.9rem' }}> diff --git a/apps/blog-next/app/register/page.tsx b/apps/blog-next/app/register/page.tsx index 168396d..4ce55e3 100644 --- a/apps/blog-next/app/register/page.tsx +++ b/apps/blog-next/app/register/page.tsx @@ -101,6 +101,7 @@ export default function RegisterPage() { Already have an account? Register with WorkOS + Register with Clerk ) } diff --git a/apps/blog-next/config/auth.ts b/apps/blog-next/config/auth.ts index b54d336..c1ec02f 100644 --- a/apps/blog-next/config/auth.ts +++ b/apps/blog-next/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/.env.example b/apps/blog-nuxt/.env.example index d382e1b..dd33c98 100644 --- a/apps/blog-nuxt/.env.example +++ b/apps/blog-nuxt/.env.example @@ -46,11 +46,11 @@ WORKOS_API_KEY= WORKOS_COOKIE_PASSWORD= WORKOS_REDIRECT_URI= WORKOS_SESSION_COOKIE= -CLERK_PUBLISHABLE_KEY= -CLERK_SECRET_KEY= -CLERK_JWT_KEY= CLERK_API_URL= CLERK_FRONTEND_API= +CLERK_PUBLISHABLE_KEY= +CLERK_REDIRECT_URI= +CLERK_SECRET_KEY= CLERK_SESSION_COOKIE= BROADCAST_CONNECTION=holo diff --git a/apps/blog-nuxt/app/app.vue b/apps/blog-nuxt/app/app.vue index 3f5562c..7fe6da3 100644 --- a/apps/blog-nuxt/app/app.vue +++ b/apps/blog-nuxt/app/app.vue @@ -24,6 +24,9 @@ async function logout() {
+
+ +
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
{ event.preventDefault(); form.submit() }}> diff --git a/apps/blog-sveltekit/src/routes/register/+page.svelte b/apps/blog-sveltekit/src/routes/register/+page.svelte index 2701da8..34d9321 100644 --- a/apps/blog-sveltekit/src/routes/register/+page.svelte +++ b/apps/blog-sveltekit/src/routes/register/+page.svelte @@ -97,6 +97,7 @@ Already have an account? Register with WorkOS + Register with Clerk