lobe-chat

Форк
0
/
asyncContext.ts 
40 строк · 1.4 Кб
1
import { NextRequest } from 'next/server';
2

3
import { JWTPayload, LOBE_CHAT_AUTH_HEADER } from '@/const/auth';
4
import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
5

6
export interface AsyncAuthContext {
7
  jwtPayload: JWTPayload;
8
  secret: string;
9
  userId?: string | null;
10
}
11

12
/**
13
 * Inner function for `createContext` where we create the context.
14
 * This is useful for testing when we don't want to mock Next.js' request/response
15
 */
16
export const createAsyncContextInner = async (params?: {
17
  jwtPayload?: JWTPayload;
18
  secret?: string;
19
  userId?: string | null;
20
}): Promise<AsyncAuthContext> => ({
21
  jwtPayload: params?.jwtPayload || {},
22
  secret: params?.secret || '',
23
  userId: params?.userId,
24
});
25

26
export type AsyncContext = Awaited<ReturnType<typeof createAsyncContextInner>>;
27

28
export const createAsyncRouteContext = async (request: NextRequest): Promise<AsyncContext> => {
29
  // for API-response caching see https://trpc.io/docs/v11/caching
30

31
  const authorization = request.headers.get('Authorization');
32
  const lobeChatAuthorization = request.headers.get(LOBE_CHAT_AUTH_HEADER);
33

34
  const secret = authorization?.split(' ')[1];
35
  const gateKeeper = await KeyVaultsGateKeeper.initWithEnvKey();
36
  const { plaintext } = await gateKeeper.decrypt(lobeChatAuthorization || '');
37

38
  const { userId, payload } = JSON.parse(plaintext);
39
  return createAsyncContextInner({ jwtPayload: payload, secret, userId });
40
};
41

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.