@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
81 lines (62 loc) • 1.83 kB
text/typescript
import { auth, currentUser, getAuth } from '@clerk/nextjs/server';
import type { NextRequest } from 'next/server';
export class ClerkAuth {
private devUserId: string | null = null;
private prodUserId: string | null = null;
constructor() {
this.parseUserIdMapping();
}
/**
* 从请求中获取认证信息和用户ID
*/
getAuthFromRequest(request: NextRequest) {
const clerkAuth = getAuth(request);
const userId = this.getMappedUserId(clerkAuth.userId);
return { clerkAuth, userId };
}
/**
* 获取当前认证信息和用户ID
*/
async getAuth() {
const clerkAuth = await auth();
const userId = this.getMappedUserId(clerkAuth.userId);
return { clerkAuth, userId };
}
async getCurrentUser() {
const user = await currentUser();
if (!user) return null;
const userId = this.getMappedUserId(user.id) as string;
return { ...user, id: userId };
}
/**
* 根据环境变量映射用户ID
*/
private getMappedUserId(originalUserId: string | null): string | null {
if (!originalUserId) return null;
// 只在开发环境下执行映射
if (
process.env.NODE_ENV === 'development' &&
this.devUserId &&
this.prodUserId &&
originalUserId === this.devUserId
) {
return this.prodUserId;
}
return originalUserId;
}
/**
* 解析环境变量中的用户ID映射配置
* 格式: "dev=prod"
*/
private parseUserIdMapping(): void {
const mappingStr = process.env.CLERK_DEV_IMPERSONATE_USER || '';
if (!mappingStr) return;
const [dev, prod] = mappingStr.split('=');
if (dev && prod) {
this.devUserId = dev.trim();
this.prodUserId = prod.trim();
}
}
}
export type IClerkAuth = ReturnType<typeof getAuth>;
export const clerkAuth = new ClerkAuth();