lobe-chat

Форк
0
/
context.ts 
71 строка · 2.1 Кб
1
/* eslint-disable @typescript-eslint/no-unused-vars */
2
import { getAuth } from '@clerk/nextjs/server';
3
import { User } from 'next-auth';
4
import { NextRequest } from 'next/server';
5

6
import { JWTPayload, LOBE_CHAT_AUTH_HEADER, enableClerk, enableNextAuth } from '@/const/auth';
7

8
type ClerkAuth = ReturnType<typeof getAuth>;
9

10
export interface AuthContext {
11
  authorizationHeader?: string | null;
12
  clerkAuth?: ClerkAuth;
13
  jwtPayload?: JWTPayload | null;
14
  nextAuth?: User;
15
  userId?: string | null;
16
}
17

18
/**
19
 * Inner function for `createContext` where we create the context.
20
 * This is useful for testing when we don't want to mock Next.js' request/response
21
 */
22
export const createContextInner = async (params?: {
23
  authorizationHeader?: string | null;
24
  clerkAuth?: ClerkAuth;
25
  nextAuth?: User;
26
  userId?: string | null;
27
}): Promise<AuthContext> => ({
28
  authorizationHeader: params?.authorizationHeader,
29
  clerkAuth: params?.clerkAuth,
30
  nextAuth: params?.nextAuth,
31
  userId: params?.userId,
32
});
33

34
export type Context = Awaited<ReturnType<typeof createContextInner>>;
35

36
/**
37
 * Creates context for an incoming request
38
 * @link https://trpc.io/docs/v11/context
39
 */
40
export const createContext = async (request: NextRequest): Promise<Context> => {
41
  // for API-response caching see https://trpc.io/docs/v11/caching
42

43
  const authorization = request.headers.get(LOBE_CHAT_AUTH_HEADER);
44

45
  let userId;
46
  let auth;
47

48
  if (enableClerk) {
49
    auth = getAuth(request);
50

51
    userId = auth.userId;
52
    return createContextInner({ authorizationHeader: authorization, clerkAuth: auth, userId });
53
  }
54

55
  if (enableNextAuth) {
56
    try {
57
      const { default: NextAuthEdge } = await import('@/libs/next-auth/edge');
58

59
      const session = await NextAuthEdge.auth();
60
      if (session && session?.user?.id) {
61
        auth = session.user;
62
        userId = session.user.id;
63
      }
64
      return createContextInner({ authorizationHeader: authorization, nextAuth: auth, userId });
65
    } catch (e) {
66
      console.error('next auth err', e);
67
    }
68
  }
69

70
  return createContextInner({ authorizationHeader: authorization, userId });
71
};
72

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

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

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

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