docs/development/basic/add-new-authentication-providers.zh-CN.mdx
LobeHub 使用 Auth.js v5 作为外部身份验证服务。Auth.js 是一个开源的身份验证库,它提供了一种简单的方式来实现身份验证和授权功能。本文档将介绍如何使用 Auth.js 来实现新的身份验证方式。
LobeHub 使用 Better Auth 作为身份验证服务。本文档介绍如何添加新的 SSO 身份验证提供商。
为了在 LobeHub 中添加新的身份验证提供者(例如添加 Okta),你需要完成以下步骤:
Better Auth SSO 提供商分为两类:
| 类型 | 说明 | 示例 |
|---|---|---|
builtin | Better Auth 内置支持的提供商 | Google、GitHub、Microsoft、Apple |
generic | 通过 Generic OIDC/OAuth 插件实现 | Okta、Auth0、Keycloak 等 |
以添加 Okta 为例,介绍添加 generic 类型提供商的完整步骤。
在 src/libs/better-auth/sso/providers/ 目录下创建 okta.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;
在 src/libs/better-auth/sso/index.ts 中导入并注册:
// 导入提供商
import Okta from './providers/okta';
// 添加到 providerDefinitions 数组
const providerDefinitions = [
// ... 其他提供商
Okta,
] as const;
在 src/envs/auth.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,
在 docs/self-hosting/auth.mdx 和 docs/self-hosting/auth.zh-CN.mdx 中添加提供商文档。
如果要添加 Better Auth 内置支持的提供商(如 Discord),步骤略有不同:
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;
在 src/libs/better-auth/constants.ts 中添加:
export const BUILTIN_BETTER_AUTH_PROVIDERS = [
'apple',
'google',
'github',
'cognito',
'microsoft',
'discord', // 新增
] as const;
配置 OAuth 应用时,回调 URL 格式为:
https://yourdomain.com/api/auth/callback/{providerId}https://yourdomain.com/api/auth/callback/{providerId}配置环境变量后,在 AUTH_SSO_PROVIDERS 中启用:
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
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 配置 |