mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-24 08:12:15 +00:00
## Todos for release - [x] Configure Env in docs project on vercel - [x] Configure Root Path in the docs project on vercel - [ ] Remove old CSP https://github.com/zitadel/website/pull/1592 ## What we did This pull request migrates the project documentation from the old `docs/` directory to the new `apps/docs/` directory, introduces a new documentation system built with Next.js and Fumadocs, and updates all relevant references, configuration files, and documentation to reflect this change. It also adds new configuration and ignore files for the new documentation app, updates CI and linting to exclude the new docs from certain checks, and revises the contributing guidelines accordingly. **Documentation System Migration and New Docs App** * Migrated all documentation from `docs/` to `apps/docs/`, and updated all references in `README.md`, `CONTRIBUTING.md`, and other files to point to the new location. [[1]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L585-L640) [[2]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L660-R607) [[3]](diffhunk://#diff-eca12c0a30e25b4b46522ebf89465a03ba72a03f540796c979137931d8f92055L740-R687) [[4]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L2-R3) [[5]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L30-R30) * Added a new Next.js/Fumadocs-based documentation app under `apps/docs/`, including core app files, layouts, routing, search API, and a comprehensive `README.md` with development and contribution instructions. [[1]](diffhunk://#diff-5a1b07344a2c1b4d3f37b23ff1388b62cd9f57dea3c1cd23d8a0412b7602b132R1-R74) [[2]](diffhunk://#diff-462b9ad1eabbb7d1c29bb9c36e4931eb180fd7190900e6d2babf8f4d66ad1c28R1-R39) [[3]](diffhunk://#diff-e16ae25660ded787b10ac35dea96d5ecaacf895dae0afc8a9bd4382dc79a8c87R1-R7) [apps/docs/app/[[...slug]]/layout.tsxR1-R81](diffhunk://#diff-59e08acde4e805b7aeccef1dcf98f1d71dfc550777e6b9402085cee0e9fa4e0aR1-R81), [apps/docs/app/[[...slug]]/page.tsxR1-R79](diffhunk://#diff-e5df3f80d0fa01e12d63d81f29c57a9d14e846c78fd3beabb2ef768e38fd9580R1-R79), [[4]](diffhunk://#diff-389b34918e040cacaa87cd7201ffa462cc2b0b716736f537e3d3c660ac69353bR1-R7) [[5]](diffhunk://#diff-d3b03416d1c457b19f1c27b26f2db741412df841b875c26ccadc36e4522247f4R1-R29) [[6]](diffhunk://#diff-c8fb8339570a5305809be7c618e14705fd86390dc278e6ce8ba224a7bc8b0c3cR1-R25) **Configuration and Tooling Updates** * Updated `.github/workflows/codeql.yml`, `.golangci.yaml`, and `.github/dependabot.yml` to properly handle the new docs app: excluded `apps/docs` from certain checks, added npm dependency updates for the docs app, and excluded generated content. [[1]](diffhunk://#diff-12783128521e452af0cfac94b99b8d250413c516ec71fe6d97dbea666ff7ba27L8-R14) [[2]](diffhunk://#diff-9917ddc9f1c3304218f7269265b746d997c5c0615478177b5fceecd33ef47cb5R5-R6) [[3]](diffhunk://#diff-9917ddc9f1c3304218f7269265b746d997c5c0615478177b5fceecd33ef47cb5R126-R129) [[4]](diffhunk://#diff-dd4fbda47e51f1e35defb9275a9cd9c212ecde0b870cba89ddaaae65c5f3cd28R89-R106) * Updated `.devcontainer/devcontainer.json` to use the latest Go 1.25.3 version for consistency. **Licensing and Miscellaneous** * Added `apps/docs/` to the list of licensed directories in `LICENSING.md`. These changes ensure the documentation is now maintained in a modern, scalable system and all project tooling is updated to support the new structure. --------- Co-authored-by: Federico Coppede <[email protected]>
196 lines
6.7 KiB
Plaintext
196 lines
6.7 KiB
Plaintext
---
|
|
title: ZITADEL with Next.js
|
|
sidebar_label: Next.js
|
|
---
|
|
|
|
This is our Zitadel [Next.js](https://nextjs.org/) template. It shows how to authenticate as a user and retrieve user information from the OIDC endpoint.
|
|
|
|
> The template code is part of our zitadel-nextjs repo. Take a look [here](https://github.com/zitadel/zitadel-nextjs).
|
|
|
|
## Getting Started
|
|
|
|
### Install dependencies
|
|
|
|
To install the dependencies type:
|
|
|
|
```bash
|
|
yarn install
|
|
```
|
|
|
|
then to run the app:
|
|
|
|
```bash
|
|
yarn dev
|
|
```
|
|
|
|
then open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
|
|
## Setup Application and Get Keys
|
|
|
|
Before we can start building our application, we have to do a few configuration steps in ZITADEL Console.
|
|
You will need to provide some information about your app.
|
|
|
|
Navigate to your Project, then add a new application at the top of the page.
|
|
Select Web application type and continue.
|
|
We use [Authorization Code](/apis/openidoauth/grant-types#authorization-code)for our NextJS application.
|
|
Select `CODE` in the next step. This makes sure you still get a secret. Note that the secret never gets exposed on the browser and is therefore kept in a confidential environment.
|
|
|
|

|
|
### Redirect URIs
|
|
|
|
With the Redirect URIs field, you tell ZITADEL where it is allowed to redirect users to after authentication. For development, you can set dev mode to `true` to enable insecure HTTP and redirect to a `localhost` URI.
|
|
|
|
> If you are following along with the [example](https://github.com/zitadel/zitadel-nextjs), set dev mode to `true` and the Redirect URIs to `http://localhost:3000/api/auth/callback/zitadel`.
|
|
|
|
If you want to redirect the users back to a route on your application after they have logged out, add an optional redirect in the Post Logout URIs field.
|
|
|
|
Continue and create the application.
|
|
|
|
### Client ID
|
|
|
|
After successful app creation, a pop-up will appear, showing the app's client ID. Copy the client ID, as you will need it to configure your NextJS app.
|
|
|
|
## NextJS Setup
|
|
|
|
Now that you have your web application configured on the ZITADEL side, you can go ahead and integrate your NextJS app.
|
|
|
|
### Configuration
|
|
|
|
NextAuth.js exposes a REST API which is used by your client.
|
|
To setup your configuration, create a file called `src/lib/auth.ts`.
|
|
You can directly import the ZITADEL provider from [next-auth](https://next-auth.js.org/providers/zitadel).
|
|
|
|
```ts reference
|
|
https://github.com/zitadel/example-auth-nextjs/blob/main/src/lib/auth.ts
|
|
```
|
|
|
|
You can overwrite the profile callback, just append it to the ZITADEL provider.
|
|
|
|
```ts
|
|
// ...
|
|
ZitadelProvider({
|
|
issuer: process.env.ZITADEL_ISSUER,
|
|
clientId: process.env.ZITADEL_CLIENT_ID,
|
|
clientSecret: process.env.ZITADEL_CLIENT_SECRET,
|
|
async profile(profile) {
|
|
return {
|
|
id: profile.sub,
|
|
name: profile.name,
|
|
firstName: profile.given_name,
|
|
lastName: profile.family_name,
|
|
email: profile.email,
|
|
loginName: profile.preferred_username,
|
|
image: profile.picture,
|
|
};
|
|
},
|
|
}),
|
|
// ...
|
|
```
|
|
|
|
If you want to request a refresh token, you can overwrite the JWT callback and add the `offline_access` scope.
|
|
|
|
```ts
|
|
// ...
|
|
async function refreshAccessToken(token: JWT): Promise<JWT> {
|
|
try {
|
|
const issuer = await Issuer.discover(process.env.ZITADEL_ISSUER ?? '');
|
|
const client = new issuer.Client({
|
|
client_id: process.env.ZITADEL_CLIENT_ID || '',
|
|
token_endpoint_auth_method: 'none',
|
|
});
|
|
|
|
const { refresh_token, access_token, expires_at } = await client.refresh(token.refreshToken as string);
|
|
|
|
return {
|
|
...token,
|
|
accessToken: access_token,
|
|
expiresAt: (expires_at ?? 0) * 1000,
|
|
refreshToken: refresh_token, // Fall back to old refresh token
|
|
};
|
|
} catch (error) {
|
|
console.error('Error during refreshAccessToken', error);
|
|
|
|
return {
|
|
...token,
|
|
error: 'RefreshAccessTokenError',
|
|
};
|
|
}
|
|
}
|
|
|
|
// ...
|
|
ZitadelProvider({
|
|
issuer: process.env.ZITADEL_ISSUER,
|
|
clientId: process.env.ZITADEL_CLIENT_ID,
|
|
clientSecret: process.env.ZITADEL_CLIENT_SECRET,
|
|
async profile(profile) {
|
|
return {
|
|
id: profile.sub,
|
|
name: profile.name,
|
|
firstName: profile.given_name,
|
|
lastName: profile.family_name,
|
|
email: profile.email,
|
|
loginName: profile.preferred_username,
|
|
image: profile.picture,
|
|
};
|
|
},
|
|
}),
|
|
// ...
|
|
```
|
|
|
|
To be able to connect to ZITADEL, make sure to add `http://localhost:3000/api/auth/callback/zitadel` as redirect url to your app.
|
|
For simplicity reasons we set the default to the one that next-auth provides us. You'll be able to change the redirect later if you want to.
|
|
|
|
Hit Create, then in the detail view of your application make sure to enable dev mode. Dev mode ensures that you can start an auth flow from a non https endpoint for testing.
|
|
|
|
Now go to Token settings and check the checkbox for **User Info inside ID Token** to get your users name directly on authentication.
|
|
|
|
### Environment
|
|
|
|
Create a file `.env` in the root of the project and add the following keys to it.
|
|
You can find your Issuer Url on the application detail page in console.
|
|
|
|
```env reference
|
|
https://github.com/zitadel/zitadel-nextjs/blob/main/.env.example
|
|
```
|
|
|
|
next-auth requires a secret for all providers, so just define a random value here.
|
|
|
|
### User interface
|
|
|
|
Now we can start editing the homepage by modifying `src/app/profile/page.tsx`. On the homepage, your authenticated user or a Signin button is shown.
|
|
|
|
Add the following component to render the UI elements:
|
|
|
|
```ts reference
|
|
|
|
https://github.com/zitadel/example-auth-nextjs/blob/main/src/app/profile/page.tsx
|
|
```
|
|
|
|
Note that the signIn method requires the id of our provider which is in our case `zitadel`.
|
|
|
|
### Userinfo API
|
|
|
|
To show user information, you can either use the idToken data, or call the userinfo endpoint.
|
|
In this example, we call the userinfo endpoint to load user data.
|
|
To implement the API, you can create a file under the `src/app/api/userinfo/` folder and call it `route.ts`.
|
|
The file should look like the following.
|
|
|
|
```ts reference
|
|
https://github.com/zitadel/zitadel-nextjs/blob/main/src/app/api/userinfo/route.ts
|
|
```
|
|
|
|
### Session state
|
|
|
|
To allow session state to be shared between pages - which improves performance, reduces network traffic and avoids component state changes while rendering - you can use the NextAuth.js Provider in `src/app/providers.tsx`.
|
|
Take a look at the template `providers.tsx`.
|
|
|
|
```ts reference
|
|
https://github.com/zitadel/zitadel-nextjs/blob/main/src/app/providers.tsx
|
|
```
|
|
|
|
Last thing: create a `page.tsx` in `src/app/profile/` which renders the callback page.
|
|
|
|
```ts reference
|
|
https://github.com/zitadel/zitadel-nextjs/blob/main/src/app/profile/page.tsx
|
|
```
|