mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-16 21:08:38 +08:00
Some checks failed
all-good: Did all the other checks pass? / all-good (push) Has been cancelled
Ensure Prisma migrations are in sync with the schema / check_prisma_migrations (22.x) (push) Has been cancelled
DB migration compat / Check if migrations changed (push) Has been cancelled
Docker Server Build and Push / Docker Build and Push Server (push) Has been cancelled
Docker Server Build and Run / docker (push) Has been cancelled
Runs E2E API Tests (Local Emulator) / E2E Tests (Local Emulator, Node ${{ matrix.node-version }}) (22.x) (push) Has been cancelled
Runs E2E API Tests / E2E Tests (Node ${{ matrix.node-version }}, Freestyle ${{ matrix.freestyle-mode }}) (mock, 22.x) (push) Has been cancelled
Runs E2E API Tests / E2E Tests (Node ${{ matrix.node-version }}, Freestyle ${{ matrix.freestyle-mode }}) (prod, 22.x) (push) Has been cancelled
Runs E2E API Tests with custom port prefix / build (22.x) (push) Has been cancelled
Lint & build / lint_and_build (latest) (push) Has been cancelled
Dev Environment Test With Custom Base Port / restart-dev-and-test-with-custom-base-port (push) Has been cancelled
Dev Environment Test / restart-dev-and-test (push) Has been cancelled
Run setup tests with custom base port / setup-tests-with-custom-base-port (push) Has been cancelled
Run setup tests / setup-tests (push) Has been cancelled
TOC Generator / TOC Generator (push) Has been cancelled
DB migration compat / Back-compat — Current branch migrations with ${{ needs.check-migrations-changed.outputs.base_branch }} branch code (push) Has been cancelled
DB migration compat / Forward-compat — Current branch code with ${{ needs.check-migrations-changed.outputs.base_branch }} branch migrations (push) Has been cancelled
DB migration compat / No migration changes (skipped) (push) Has been cancelled
83 lines
2.7 KiB
Plaintext
83 lines
2.7 KiB
Plaintext
---
|
|
title: Custom Pages
|
|
description: Take full control over the layout and logic flow of authentication pages in your application.
|
|
---
|
|
|
|
Custom pages allow you to take full control over the layout and logic flow of authentication pages in your application. Instead of using the default pages provided by Stack Auth, you can build your own using our built-in components or low-level functions.
|
|
|
|
By default, `StackHandler` creates all authentication pages you need, however, you can replace them with your own custom implementations for a more tailored user experience.
|
|
|
|
## Simple Example
|
|
|
|
For example, if you want to create a custom sign-in page with a customized title on the top, you can create a file at `app/signin/page.tsx`:
|
|
|
|
```tsx title="app/signin/page.tsx"
|
|
import { SignIn } from "@stackframe/stack";
|
|
|
|
export default function CustomSignInPage() {
|
|
return (
|
|
<div>
|
|
<h1>My Custom Sign In page</h1>
|
|
<SignIn />
|
|
</div>
|
|
);
|
|
}
|
|
```
|
|
|
|
Then you can instruct the Stack app in `stack/server.ts` to use your custom sign in page:
|
|
|
|
```tsx title="stack/server.ts"
|
|
export const stackServerApp = new StackServerApp({
|
|
// ...
|
|
// add these three lines
|
|
urls: {
|
|
signIn: '/signin',
|
|
}
|
|
});
|
|
```
|
|
|
|
You are now all set! If you visit the `/signin` page, you should see your custom sign in page. When users attempt to access a protected page or navigate to the default `/handler/sign-in` URL, they will automatically be redirected to your new custom sign-in page.
|
|
|
|
For more examples, please refer to the [Examples](./page-examples).
|
|
|
|
## Building From Scratch
|
|
|
|
While the simple approach above lets you customize the layout while using Stack's pre-built components, sometimes you need complete control over both the UI and authentication logic.
|
|
|
|
We also provide the low-level functions powering our components, so that you can build your own logic. For example, to build a custom OAuth sign-in button, create a file at `app/signin/page.tsx`:
|
|
|
|
```tsx title="app/signin/page.tsx"
|
|
'use client';
|
|
import { useStackApp } from "@stackframe/stack";
|
|
|
|
export default function CustomOAuthSignIn() {
|
|
const app = useStackApp();
|
|
|
|
return (
|
|
<div>
|
|
<h1>My Custom Sign In page</h1>
|
|
<button onClick={async () => {
|
|
// This will redirect to the OAuth provider's login page.
|
|
await app.signInWithOAuth('google');
|
|
}}>
|
|
Sign In with Google
|
|
</button>
|
|
</div>
|
|
);
|
|
}
|
|
```
|
|
|
|
Again, edit the Stack app in `stack/server.ts` to use your custom sign in page:
|
|
|
|
```tsx title="stack/server.ts"
|
|
export const stackServerApp = new StackServerApp({
|
|
// ...
|
|
// add these three lines
|
|
urls: {
|
|
signIn: '/signin',
|
|
}
|
|
});
|
|
```
|
|
|
|
As above, visit the `/signin` page to see your newly created custom OAuth page.
|