mirror of
https://github.com/lobehub/lobehub
synced 2026-04-21 17:47:27 +00:00
203 lines
5.9 KiB
Text
203 lines
5.9 KiB
Text
---
|
||
title: 新身份验证方式开发指南
|
||
description: 学习如何在 LobeHub 中使用 Auth.js v5 添加新的身份验证提供者。
|
||
tags:
|
||
- 身份验证
|
||
- Auth.js
|
||
- Okta
|
||
- 开发指南
|
||
---
|
||
|
||
# 新身份验证方式开发指南
|
||
|
||
LobeHub 使用 [Auth.js v5](https://authjs.dev/) 作为外部身份验证服务。Auth.js 是一个开源的身份验证库,它提供了一种简单的方式来实现身份验证和授权功能。本文档将介绍如何使用 Auth.js 来实现新的身份验证方式。
|
||
|
||
LobeHub 使用 [Better Auth](https://www.better-auth.com) 作为身份验证服务。本文档介绍如何添加新的 SSO 身份验证提供商。
|
||
|
||
为了在 LobeHub 中添加新的身份验证提供者(例如添加 Okta),你需要完成以下步骤:
|
||
|
||
Better Auth SSO 提供商分为两类:
|
||
|
||
| 类型 | 说明 | 示例 |
|
||
| --------- | -------------------------- | ----------------------------- |
|
||
| `builtin` | Better Auth 内置支持的提供商 | Google、GitHub、Microsoft、Apple |
|
||
| `generic` | 通过 Generic OIDC/OAuth 插件实现 | Okta、Auth0、Keycloak 等 |
|
||
|
||
## 添加新的 SSO 提供商
|
||
|
||
以添加 **Okta** 为例,介绍添加 `generic` 类型提供商的完整步骤。
|
||
|
||
### 步骤 1: 创建提供商定义文件
|
||
|
||
在 `src/libs/better-auth/sso/providers/` 目录下创建 `okta.ts`:
|
||
|
||
```ts
|
||
import { authEnv } from '@/envs/auth';
|
||
|
||
import { buildOidcConfig } from '../helpers';
|
||
import type { GenericProviderDefinition } from '../types';
|
||
|
||
const provider: GenericProviderDefinition<{
|
||
AUTH_OKTA_ID: string;
|
||
AUTH_OKTA_ISSUER: string;
|
||
AUTH_OKTA_SECRET: string;
|
||
}> = {
|
||
// 构建 OIDC 配置
|
||
build: (env) =>
|
||
buildOidcConfig({
|
||
clientId: env.AUTH_OKTA_ID,
|
||
clientSecret: env.AUTH_OKTA_SECRET,
|
||
issuer: env.AUTH_OKTA_ISSUER,
|
||
overrides: {
|
||
// 可选:自定义用户信息映射
|
||
mapProfileToUser: (profile) => ({
|
||
email: profile.email,
|
||
name: profile.name ?? profile.preferred_username ?? profile.email ?? profile.sub,
|
||
}),
|
||
},
|
||
providerId: 'okta',
|
||
}),
|
||
|
||
// 环境变量检查
|
||
checkEnvs: () => {
|
||
return !!(authEnv.AUTH_OKTA_ID && authEnv.AUTH_OKTA_SECRET && authEnv.AUTH_OKTA_ISSUER)
|
||
? {
|
||
AUTH_OKTA_ID: authEnv.AUTH_OKTA_ID,
|
||
AUTH_OKTA_ISSUER: authEnv.AUTH_OKTA_ISSUER,
|
||
AUTH_OKTA_SECRET: authEnv.AUTH_OKTA_SECRET,
|
||
}
|
||
: false;
|
||
},
|
||
|
||
// 提供商 ID(用于 AUTH_SSO_PROVIDERS 配置)
|
||
id: 'okta',
|
||
type: 'generic',
|
||
};
|
||
|
||
export default provider;
|
||
```
|
||
|
||
### 步骤 2: 注册提供商
|
||
|
||
在 `src/libs/better-auth/sso/index.ts` 中导入并注册:
|
||
|
||
```ts
|
||
// 导入提供商
|
||
import Okta from './providers/okta';
|
||
|
||
// 添加到 providerDefinitions 数组
|
||
const providerDefinitions = [
|
||
// ... 其他提供商
|
||
Okta,
|
||
] as const;
|
||
```
|
||
|
||
### 步骤 3: 添加环境变量类型声明
|
||
|
||
在 `src/envs/auth.ts` 中添加类型声明:
|
||
|
||
```ts
|
||
// ProcessEnv 接口中添加
|
||
AUTH_OKTA_ID?: string;
|
||
AUTH_OKTA_SECRET?: string;
|
||
AUTH_OKTA_ISSUER?: string;
|
||
|
||
// getAuthConfig server schema 中添加
|
||
AUTH_OKTA_ID: z.string().optional(),
|
||
AUTH_OKTA_SECRET: z.string().optional(),
|
||
AUTH_OKTA_ISSUER: z.string().optional(),
|
||
|
||
// runtimeEnv 中添加
|
||
AUTH_OKTA_ID: process.env.AUTH_OKTA_ID,
|
||
AUTH_OKTA_SECRET: process.env.AUTH_OKTA_SECRET,
|
||
AUTH_OKTA_ISSUER: process.env.AUTH_OKTA_ISSUER,
|
||
```
|
||
|
||
### 步骤 4: 更新文档(可选)
|
||
|
||
在 `docs/self-hosting/auth.mdx` 和 `docs/self-hosting/auth.zh-CN.mdx` 中添加提供商文档。
|
||
|
||
## 添加内置提供商
|
||
|
||
如果要添加 Better Auth 内置支持的提供商(如 Discord),步骤略有不同:
|
||
|
||
### 步骤 1: 创建提供商定义文件
|
||
|
||
```ts
|
||
import { authEnv } from '@/envs/auth';
|
||
|
||
import type { BuiltinProviderDefinition } from '../types';
|
||
|
||
const provider: BuiltinProviderDefinition<{
|
||
AUTH_DISCORD_ID: string;
|
||
AUTH_DISCORD_SECRET: string;
|
||
}> = {
|
||
build: (env) => ({
|
||
clientId: env.AUTH_DISCORD_ID,
|
||
clientSecret: env.AUTH_DISCORD_SECRET,
|
||
}),
|
||
checkEnvs: () => {
|
||
return !!(authEnv.AUTH_DISCORD_ID && authEnv.AUTH_DISCORD_SECRET)
|
||
? {
|
||
AUTH_DISCORD_ID: authEnv.AUTH_DISCORD_ID,
|
||
AUTH_DISCORD_SECRET: authEnv.AUTH_DISCORD_SECRET,
|
||
}
|
||
: false;
|
||
},
|
||
id: 'discord',
|
||
type: 'builtin',
|
||
};
|
||
|
||
export default provider;
|
||
```
|
||
|
||
### 步骤 2: 更新常量文件
|
||
|
||
在 `src/libs/better-auth/constants.ts` 中添加:
|
||
|
||
```ts
|
||
export const BUILTIN_BETTER_AUTH_PROVIDERS = [
|
||
'apple',
|
||
'google',
|
||
'github',
|
||
'cognito',
|
||
'microsoft',
|
||
'discord', // 新增
|
||
] as const;
|
||
```
|
||
|
||
## 回调 URL 格式
|
||
|
||
配置 OAuth 应用时,回调 URL 格式为:
|
||
|
||
- **内置提供商**:`https://yourdomain.com/api/auth/callback/{providerId}`
|
||
- **Generic OIDC**:`https://yourdomain.com/api/auth/callback/{providerId}`
|
||
|
||
## 使用新提供商
|
||
|
||
配置环境变量后,在 `AUTH_SSO_PROVIDERS` 中启用:
|
||
|
||
```bash
|
||
AUTH_SSO_PROVIDERS=google,github,okta
|
||
AUTH_OKTA_ID=your-client-id
|
||
AUTH_OKTA_SECRET=your-client-secret
|
||
AUTH_OKTA_ISSUER=https://your-domain.okta.com
|
||
```
|
||
|
||
## 调试技巧
|
||
|
||
1. **环境变量检查失败**:确保所有必需的环境变量都已设置
|
||
2. **回调 URL 错误**:检查 OAuth 应用配置的回调 URL 是否正确
|
||
3. **用户信息映射**:通过 `mapProfileToUser` 自定义从 OAuth profile 到用户信息的映射
|
||
|
||
## 相关文件
|
||
|
||
| 文件 | 说明 |
|
||
| ----------------------------------------- | -------------- |
|
||
| `src/libs/better-auth/sso/providers/*.ts` | 提供商定义 |
|
||
| `src/libs/better-auth/sso/index.ts` | 提供商注册 |
|
||
| `src/libs/better-auth/sso/types.ts` | 类型定义 |
|
||
| `src/libs/better-auth/sso/helpers.ts` | 辅助函数 |
|
||
| `src/libs/better-auth/constants.ts` | 内置提供商常量 |
|
||
| `src/envs/auth.ts` | 环境变量定义 |
|
||
| `src/libs/better-auth/define-config.ts` | Better Auth 配置 |
|