@lobehub/chat 1.79.8 → 1.79.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -0
- package/CHANGELOG.md +58 -0
- package/changelog/v1.json +18 -0
- package/locales/ar/models.json +9 -0
- package/locales/ar/oauth.json +7 -6
- package/locales/bg-BG/models.json +9 -0
- package/locales/bg-BG/oauth.json +7 -6
- package/locales/de-DE/models.json +9 -0
- package/locales/de-DE/oauth.json +7 -6
- package/locales/en-US/models.json +9 -0
- package/locales/en-US/oauth.json +7 -6
- package/locales/es-ES/models.json +9 -0
- package/locales/es-ES/oauth.json +7 -6
- package/locales/fa-IR/models.json +9 -0
- package/locales/fa-IR/oauth.json +7 -6
- package/locales/fr-FR/models.json +9 -0
- package/locales/fr-FR/oauth.json +7 -6
- package/locales/it-IT/models.json +9 -0
- package/locales/it-IT/oauth.json +7 -6
- package/locales/ja-JP/models.json +9 -0
- package/locales/ja-JP/oauth.json +7 -6
- package/locales/ko-KR/models.json +9 -0
- package/locales/ko-KR/oauth.json +7 -6
- package/locales/nl-NL/models.json +9 -0
- package/locales/nl-NL/oauth.json +7 -6
- package/locales/pl-PL/models.json +9 -0
- package/locales/pl-PL/oauth.json +7 -6
- package/locales/pt-BR/models.json +9 -0
- package/locales/pt-BR/oauth.json +7 -6
- package/locales/ru-RU/models.json +9 -0
- package/locales/ru-RU/oauth.json +7 -6
- package/locales/tr-TR/models.json +9 -0
- package/locales/tr-TR/oauth.json +7 -6
- package/locales/vi-VN/models.json +9 -0
- package/locales/vi-VN/oauth.json +7 -6
- package/locales/zh-CN/models.json +9 -0
- package/locales/zh-CN/oauth.json +7 -6
- package/locales/zh-TW/models.json +9 -0
- package/locales/zh-TW/oauth.json +7 -6
- package/package.json +1 -1
- package/src/app/(backend)/oidc/[...oidc]/route.ts +27 -201
- package/src/app/(backend)/oidc/consent/route.ts +58 -24
- package/src/app/(backend)/trpc/async/[trpc]/route.ts +1 -1
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +2 -2
- package/src/app/(backend)/trpc/lambda/[trpc]/route.ts +2 -2
- package/src/app/(backend)/trpc/tools/[trpc]/route.ts +2 -2
- package/src/app/[variants]/(main)/files/[id]/page.tsx +1 -1
- package/src/app/[variants]/oauth/consent/[uid]/Client.tsx +184 -57
- package/src/app/[variants]/oauth/consent/[uid]/ClientError.tsx +46 -0
- package/src/app/[variants]/oauth/consent/[uid]/page.tsx +19 -21
- package/src/components/Branding/ProductLogo/index.tsx +6 -1
- package/src/config/aiModels/openai.ts +63 -41
- package/src/config/modelProviders/openai.ts +17 -0
- package/src/const/settings/llm.ts +1 -1
- package/src/database/server/models/__tests__/adapter.test.ts +1 -5
- package/src/libs/oidc-provider/adapter.ts +47 -0
- package/src/libs/oidc-provider/config.ts +4 -5
- package/src/libs/oidc-provider/http-adapter.ts +60 -28
- package/src/libs/oidc-provider/provider.ts +41 -13
- package/src/libs/trpc/async/init.ts +1 -1
- package/src/{server → libs/trpc/edge}/context.ts +2 -2
- package/src/libs/trpc/{index.ts → edge/index.ts} +8 -8
- package/src/libs/trpc/{init.ts → edge/init.ts} +2 -2
- package/src/libs/trpc/{middleware → edge/middleware}/jwtPayload.test.ts +3 -3
- package/src/libs/trpc/{middleware → edge/middleware}/jwtPayload.ts +3 -2
- package/src/libs/trpc/lambda/context.ts +70 -0
- package/src/libs/trpc/lambda/index.ts +39 -1
- package/src/libs/trpc/lambda/init.ts +26 -0
- package/src/libs/trpc/lambda/middleware/index.ts +2 -0
- package/src/libs/trpc/{middleware → lambda/middleware}/keyVaults.ts +2 -1
- package/src/libs/trpc/lambda/{serverDatabase.ts → middleware/serverDatabase.ts} +2 -1
- package/src/libs/trpc/middleware/userAuth.test.ts +3 -3
- package/src/libs/trpc/middleware/userAuth.ts +1 -1
- package/src/libs/trpc/mock.ts +7 -0
- package/src/locales/default/oauth.ts +8 -6
- package/src/server/routers/edge/appStatus.ts +1 -1
- package/src/server/routers/edge/config/index.test.ts +2 -3
- package/src/server/routers/edge/config/index.ts +1 -1
- package/src/server/routers/edge/index.ts +1 -1
- package/src/server/routers/edge/upload.ts +1 -1
- package/src/server/routers/lambda/_template.ts +2 -2
- package/src/server/routers/lambda/agent.ts +2 -2
- package/src/server/routers/lambda/aiModel.ts +2 -2
- package/src/server/routers/lambda/aiProvider.ts +2 -2
- package/src/server/routers/lambda/chunk.ts +2 -3
- package/src/server/routers/lambda/exporter.ts +2 -2
- package/src/server/routers/lambda/file.ts +2 -2
- package/src/server/routers/lambda/importer.ts +2 -2
- package/src/server/routers/lambda/index.ts +1 -1
- package/src/server/routers/lambda/knowledgeBase.ts +2 -2
- package/src/server/routers/lambda/message.ts +2 -2
- package/src/server/routers/lambda/plugin.ts +2 -2
- package/src/server/routers/lambda/ragEval.ts +2 -3
- package/src/server/routers/lambda/session.ts +2 -2
- package/src/server/routers/lambda/sessionGroup.ts +2 -2
- package/src/server/routers/lambda/thread.ts +2 -2
- package/src/server/routers/lambda/topic.ts +2 -2
- package/src/server/routers/lambda/user.ts +2 -2
- package/src/server/routers/tools/__tests__/search.test.ts +2 -2
- package/src/server/routers/tools/index.ts +1 -1
- package/src/server/routers/tools/search.ts +3 -1
- package/src/server/services/oidc/index.ts +36 -1
- package/src/server/services/oidc/oidcProvider.ts +1 -3
- package/src/services/chat.ts +1 -0
- package/src/store/agent/slices/chat/selectors/__snapshots__/agent.test.ts.snap +1 -1
- package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +1 -0
- package/src/store/user/slices/settings/selectors/__snapshots__/settings.test.ts.snap +8 -8
- package/src/server/mock.ts +0 -8
- /package/src/{server/asyncContext.ts → libs/trpc/async/context.ts} +0 -0
@@ -1,188 +1,17 @@
|
|
1
1
|
import debug from 'debug';
|
2
2
|
import { NextRequest, NextResponse } from 'next/server';
|
3
|
-
import { randomUUID } from 'node:crypto';
|
4
3
|
import { URL } from 'node:url';
|
5
4
|
|
6
|
-
import { getDBInstance } from '@/database/core/web-server';
|
7
5
|
import { oidcEnv } from '@/envs/oidc';
|
8
|
-
import { DrizzleAdapter } from '@/libs/oidc-provider/adapter';
|
9
6
|
import { createNodeRequest, createNodeResponse } from '@/libs/oidc-provider/http-adapter';
|
10
7
|
import { getOIDCProvider } from '@/server/services/oidc/oidcProvider';
|
11
8
|
|
12
9
|
const log = debug('lobe-oidc:route'); // Create a debug instance with a namespace
|
13
10
|
|
14
|
-
|
15
|
-
const OIDC_SESSION_HEADER = 'x-oidc-session-sync';
|
16
|
-
|
17
|
-
/**
|
18
|
-
* 处理会话同步
|
19
|
-
* 如果请求中包含 x-oidc-session-sync 头,预先创建一个 OIDC 会话
|
20
|
-
*/
|
21
|
-
const syncOIDCSession = async (req: NextRequest): Promise<void> => {
|
22
|
-
const externalUserId = req.headers.get(OIDC_SESSION_HEADER);
|
23
|
-
|
24
|
-
if (!externalUserId) {
|
25
|
-
log('没有找到 x-oidc-session-sync 头,跳过会话同步');
|
26
|
-
return;
|
27
|
-
}
|
28
|
-
|
29
|
-
log('找到会话同步请求,外部用户 ID: %s', externalUserId);
|
30
|
-
|
31
|
-
try {
|
32
|
-
const db = getDBInstance();
|
33
|
-
const sessionAdapter = new DrizzleAdapter('Session', db);
|
34
|
-
|
35
|
-
// 查找是否已有对应的 OIDC 会话
|
36
|
-
// 使用新方法按用户 ID 查找会话
|
37
|
-
const existingSession = await sessionAdapter.findSessionByUserId(externalUserId);
|
38
|
-
|
39
|
-
if (existingSession) {
|
40
|
-
log(
|
41
|
-
'已找到与用户 %s 关联的现有 OIDC 会话,ID: %s',
|
42
|
-
externalUserId,
|
43
|
-
existingSession.uid || existingSession.jti,
|
44
|
-
);
|
45
|
-
return;
|
46
|
-
}
|
47
|
-
|
48
|
-
// 创建新的会话
|
49
|
-
const sessionId = randomUUID();
|
50
|
-
const now = Math.floor(Date.now() / 1000);
|
51
|
-
const expiresIn = 30 * 24 * 60 * 60; // 30 天,与 provider.ts 中的 TTL 配置一致
|
52
|
-
|
53
|
-
// 创建基本会话数据
|
54
|
-
const sessionData = {
|
55
|
-
accountId: externalUserId,
|
56
|
-
|
57
|
-
// 添加额外会话信息
|
58
|
-
authTime: now,
|
59
|
-
|
60
|
-
// 添加所有必要的 OIDC 会话字段
|
61
|
-
cookie: `oidc.session.${sessionId}`,
|
62
|
-
|
63
|
-
exp: now + expiresIn,
|
64
|
-
|
65
|
-
iat: now,
|
66
|
-
|
67
|
-
jti: sessionId,
|
68
|
-
|
69
|
-
// 为 findAccount 添加必要的字段
|
70
|
-
login: {
|
71
|
-
accountId: externalUserId,
|
72
|
-
remember: true,
|
73
|
-
},
|
74
|
-
|
75
|
-
uid: sessionId,
|
76
|
-
username: externalUserId,
|
77
|
-
};
|
78
|
-
|
79
|
-
// 使用适配器创建会话
|
80
|
-
await sessionAdapter.upsert(sessionId, sessionData, expiresIn);
|
81
|
-
log('成功为外部用户 %s 创建 OIDC 会话 %s', externalUserId, sessionId);
|
82
|
-
} catch (error) {
|
83
|
-
log('同步 OIDC 会话时出错: %O', error);
|
84
|
-
console.error('同步 OIDC 会话错误:', error);
|
85
|
-
// 不抛出错误,让请求继续处理
|
86
|
-
}
|
87
|
-
};
|
88
|
-
|
89
|
-
/**
|
90
|
-
* 处理 catch-all 路由下的所有 OIDC 请求
|
91
|
-
* 这个处理器会捕获所有 /oauth/[...oidc] 的请求
|
92
|
-
* 例如: /oauth/auth, /oauth/token, /oauth/userinfo 等
|
93
|
-
*/
|
94
|
-
export async function GET(req: NextRequest) {
|
11
|
+
const handler = async (req: NextRequest) => {
|
95
12
|
const requestUrl = new URL(req.url);
|
96
|
-
log(
|
13
|
+
log(`Received ${req.method.toUpperCase()} request: %s %s`, req.method, req.url);
|
97
14
|
log('Path: %s, Pathname: %s', requestUrl.pathname, requestUrl.pathname);
|
98
|
-
log('Headers: %O', Object.fromEntries(req.headers.entries())); // Log headers object
|
99
|
-
|
100
|
-
// 声明响应收集器
|
101
|
-
let responseCollector;
|
102
|
-
|
103
|
-
try {
|
104
|
-
if (!oidcEnv.ENABLE_OIDC) {
|
105
|
-
log('OIDC is not enabled');
|
106
|
-
return new NextResponse('OIDC is not enabled', { status: 404 });
|
107
|
-
}
|
108
|
-
|
109
|
-
// 在获取 OIDC 提供者实例前同步会话
|
110
|
-
await syncOIDCSession(req);
|
111
|
-
|
112
|
-
// 获取 OIDC Provider 实例
|
113
|
-
const provider = await getOIDCProvider();
|
114
|
-
|
115
|
-
log('Calling provider.callback() for GET');
|
116
|
-
await new Promise<void>((resolve, reject) => {
|
117
|
-
let middleware: any;
|
118
|
-
try {
|
119
|
-
log('Attempting to get middleware from provider.callback()');
|
120
|
-
middleware = provider.callback();
|
121
|
-
log('Successfully obtained middleware function.');
|
122
|
-
} catch (syncError) {
|
123
|
-
log('SYNC ERROR during provider.callback() call itself: %O', syncError);
|
124
|
-
reject(syncError);
|
125
|
-
return;
|
126
|
-
}
|
127
|
-
|
128
|
-
// 使用辅助方法创建响应收集器
|
129
|
-
responseCollector = createNodeResponse(resolve);
|
130
|
-
const nodeResponse = responseCollector.nodeResponse;
|
131
|
-
|
132
|
-
// 使用辅助方法创建 Node.js 请求对象
|
133
|
-
const nodeRequest = createNodeRequest(req);
|
134
|
-
|
135
|
-
log('Calling the obtained middleware...');
|
136
|
-
middleware(nodeRequest, nodeResponse, (error?: Error) => {
|
137
|
-
log('Middleware callback function HAS BEEN EXECUTED.');
|
138
|
-
if (error) {
|
139
|
-
log('Middleware error reported via callback: %O', error);
|
140
|
-
reject(error); // Reject if callback reports error
|
141
|
-
} else {
|
142
|
-
log(
|
143
|
-
'Middleware completed successfully via callback (may be redundant if .end() was called).',
|
144
|
-
);
|
145
|
-
// Ensure promise resolves even if end() wasn't called but callback was
|
146
|
-
resolve();
|
147
|
-
}
|
148
|
-
});
|
149
|
-
log('Middleware call initiated, waiting for its callback OR nodeResponse.end()...');
|
150
|
-
});
|
151
|
-
|
152
|
-
log('Promise surrounding middleware call resolved.');
|
153
|
-
|
154
|
-
if (!responseCollector) {
|
155
|
-
throw new Error('ResponseCollector was not initialized.');
|
156
|
-
}
|
157
|
-
|
158
|
-
const {
|
159
|
-
responseStatus: finalStatus,
|
160
|
-
responseBody: finalBody,
|
161
|
-
responseHeaders: finalHeaders,
|
162
|
-
} = responseCollector;
|
163
|
-
|
164
|
-
log('Final Response Status: %d', finalStatus);
|
165
|
-
log('Final Response Headers: %O', finalHeaders);
|
166
|
-
|
167
|
-
return new NextResponse(finalBody, {
|
168
|
-
// eslint-disable-next-line no-undef
|
169
|
-
headers: finalHeaders as HeadersInit,
|
170
|
-
status: finalStatus,
|
171
|
-
});
|
172
|
-
} catch (error) {
|
173
|
-
log('Error handling OIDC GET request: %O', error); // Log the full error object
|
174
|
-
// Ensure responseCollector is checked even in catch block if needed, though error likely occurred before/during promise
|
175
|
-
return new NextResponse(`Internal Server Error: ${(error as Error).message}`, { status: 500 });
|
176
|
-
}
|
177
|
-
}
|
178
|
-
|
179
|
-
/**
|
180
|
-
* 处理 POST 请求 (用于令牌端点等)
|
181
|
-
*/
|
182
|
-
export async function POST(req: NextRequest) {
|
183
|
-
log('Received POST request: %s %s', req.method, req.url);
|
184
|
-
const bodyText = await req.text(); // Read body first
|
185
|
-
log('Body: %s', bodyText); // Log body as string
|
186
15
|
|
187
16
|
// 声明响应收集器
|
188
17
|
let responseCollector;
|
@@ -193,14 +22,12 @@ export async function POST(req: NextRequest) {
|
|
193
22
|
return new NextResponse('OIDC is not enabled', { status: 404 });
|
194
23
|
}
|
195
24
|
|
196
|
-
// 在获取 OIDC 提供者实例前同步会话
|
197
|
-
await syncOIDCSession(req);
|
198
|
-
|
199
25
|
// 获取 OIDC Provider 实例
|
200
26
|
const provider = await getOIDCProvider();
|
201
27
|
|
202
|
-
log(
|
28
|
+
log(`Calling provider.callback() for ${req.method}`); // Log the method
|
203
29
|
await new Promise<void>((resolve, reject) => {
|
30
|
+
// <-- Make promise callback async
|
204
31
|
let middleware: any;
|
205
32
|
try {
|
206
33
|
log('Attempting to get middleware from provider.callback()');
|
@@ -216,23 +43,23 @@ export async function POST(req: NextRequest) {
|
|
216
43
|
responseCollector = createNodeResponse(resolve);
|
217
44
|
const nodeResponse = responseCollector.nodeResponse;
|
218
45
|
|
219
|
-
// 使用辅助方法创建 Node.js
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
}
|
46
|
+
// 使用辅助方法创建 Node.js 请求对象,现在需要 await
|
47
|
+
createNodeRequest(req).then((nodeRequest) => {
|
48
|
+
log('Calling the obtained middleware...');
|
49
|
+
middleware(nodeRequest, nodeResponse, (error?: Error) => {
|
50
|
+
log('Middleware callback function HAS BEEN EXECUTED.');
|
51
|
+
if (error) {
|
52
|
+
log('Middleware error reported via callback: %O', error);
|
53
|
+
reject(error);
|
54
|
+
} else {
|
55
|
+
log(
|
56
|
+
'Middleware completed successfully via callback (may be redundant if .end() was called).',
|
57
|
+
);
|
58
|
+
resolve();
|
59
|
+
}
|
60
|
+
});
|
61
|
+
log('Middleware call initiated, waiting for its callback OR nodeResponse.end()...');
|
234
62
|
});
|
235
|
-
log('Middleware call initiated, waiting for its callback OR nodeResponse.end()...');
|
236
63
|
});
|
237
64
|
|
238
65
|
log('Promise surrounding middleware call resolved.');
|
@@ -257,14 +84,13 @@ export async function POST(req: NextRequest) {
|
|
257
84
|
status: finalStatus,
|
258
85
|
});
|
259
86
|
} catch (error) {
|
260
|
-
log(
|
87
|
+
log(`Error handling OIDC ${req.method} request: %O`, error); // Log method in error
|
261
88
|
return new NextResponse(`Internal Server Error: ${(error as Error).message}`, { status: 500 });
|
262
89
|
}
|
263
|
-
}
|
90
|
+
};
|
264
91
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
export const
|
269
|
-
export const
|
270
|
-
export const PATCH = POST;
|
92
|
+
export const GET = handler;
|
93
|
+
export const POST = handler;
|
94
|
+
export const PUT = handler;
|
95
|
+
export const DELETE = handler;
|
96
|
+
export const PATCH = handler;
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import debug from 'debug';
|
2
2
|
import { NextRequest, NextResponse } from 'next/server';
|
3
|
-
import urlJoin from 'url-join';
|
4
3
|
|
5
|
-
import { appEnv } from '@/config/app';
|
6
4
|
import { OIDCService } from '@/server/services/oidc';
|
5
|
+
import { getUserAuth } from '@/utils/server/auth';
|
7
6
|
|
8
7
|
const log = debug('lobe-oidc:consent');
|
9
8
|
|
10
9
|
export async function POST(request: NextRequest) {
|
10
|
+
log('Received POST request for /oidc/consent, URL: %s', request.url);
|
11
11
|
try {
|
12
12
|
const formData = await request.formData();
|
13
13
|
const consent = formData.get('consent') as string;
|
@@ -43,22 +43,64 @@ export async function POST(request: NextRequest) {
|
|
43
43
|
throw error;
|
44
44
|
}
|
45
45
|
|
46
|
+
const { prompt } = details;
|
46
47
|
let result;
|
47
48
|
if (consent === 'accept') {
|
49
|
+
log(`User accepted the request, Handling 'login' prompt`);
|
50
|
+
const { userId } = await getUserAuth();
|
51
|
+
log('Obtained userId: %s', userId);
|
52
|
+
|
48
53
|
if (details.prompt.name === 'login') {
|
49
54
|
result = {
|
50
|
-
login: { accountId:
|
55
|
+
login: { accountId: userId, remember: true },
|
51
56
|
};
|
52
57
|
} else {
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
58
|
+
log(`Handling 'consent' prompt`);
|
59
|
+
|
60
|
+
// 1. 获取必要的 ID
|
61
|
+
const clientId = details.params.client_id as string;
|
62
|
+
|
63
|
+
// 2. 查找或创建 Grant 对象
|
64
|
+
const grant = await oidcService.findOrCreateGrants(userId!, clientId, details.grantId);
|
65
|
+
|
66
|
+
// 3. 将用户同意的 scopes 和 claims 添加到 Grant 对象
|
67
|
+
// 这些信息通常在 details.prompt.details 中
|
68
|
+
const missingOIDCScope = (prompt.details.missingOIDCScope as string[]) || [];
|
69
|
+
if (missingOIDCScope) {
|
70
|
+
grant.addOIDCScope(missingOIDCScope.join(' '));
|
71
|
+
log('Added OIDC scopes to grant: %s', missingOIDCScope.join(' '));
|
72
|
+
}
|
73
|
+
const missingOIDCClaims = (prompt.details.missingOIDCClaims as string[]) || [];
|
74
|
+
if (missingOIDCClaims) {
|
75
|
+
grant.addOIDCClaims(missingOIDCClaims);
|
76
|
+
log('Added OIDC claims to grant: %s', missingOIDCClaims.join(' '));
|
77
|
+
}
|
78
|
+
|
79
|
+
const missingResourceScopes =
|
80
|
+
(prompt.details.missingResourceScopes as Record<string, string[]>) || {};
|
81
|
+
if (missingResourceScopes) {
|
82
|
+
for (const [indicator, scopes] of Object.entries(missingResourceScopes)) {
|
83
|
+
grant.addResourceScope(indicator, scopes.join(' '));
|
84
|
+
log('Added resource scopes for %s to grant: %s', indicator, scopes.join(' '));
|
85
|
+
}
|
86
|
+
}
|
87
|
+
// 如果使用了 RAR (Rich Authorization Requests),也需要添加到 grant
|
88
|
+
// if (prompt.details.rar) {
|
89
|
+
// prompt.details.rar.forEach(detail => grant.addRar(detail));
|
90
|
+
// }
|
91
|
+
|
92
|
+
// 4. 保存 Grant 对象以获取其 jti (grantId)
|
93
|
+
const newGrantId = await grant.save();
|
94
|
+
log('Saved grant with ID: %s', newGrantId);
|
95
|
+
|
96
|
+
// 5. 准备包含 grantId 的 result
|
97
|
+
result = { consent: { grantId: newGrantId } };
|
98
|
+
|
99
|
+
log('Consent result prepared with grantId');
|
59
100
|
}
|
60
101
|
log('User %s the authorization', consent);
|
61
102
|
} else {
|
103
|
+
log('User rejected the request');
|
62
104
|
result = {
|
63
105
|
error: 'access_denied',
|
64
106
|
error_description: 'User denied the authorization request',
|
@@ -66,23 +108,15 @@ export async function POST(request: NextRequest) {
|
|
66
108
|
log('User %s the authorization', consent);
|
67
109
|
}
|
68
110
|
|
69
|
-
|
70
|
-
const redirectUrl = await oidcService.getInteractionResult(uid, result);
|
71
|
-
log('Default redirectUrl: %s', redirectUrl);
|
111
|
+
log('Interaction Result: %O', result);
|
72
112
|
|
73
|
-
|
113
|
+
const internalRedirectUrlString = await oidcService.getInteractionResult(uid, result);
|
114
|
+
log('OIDC Provider internal redirect URL string: %s', internalRedirectUrlString);
|
74
115
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
return NextResponse.redirect(successUrl);
|
80
|
-
} else {
|
81
|
-
// 用户拒绝授权,跳转到failed页面
|
82
|
-
const failedUrl = urlJoin(appEnv.APP_URL!, `/oauth/consent/${uid}/failed`);
|
83
|
-
log('Redirecting to failed page: %s', failedUrl);
|
84
|
-
return NextResponse.redirect(failedUrl);
|
85
|
-
}
|
116
|
+
return NextResponse.redirect(internalRedirectUrlString, {
|
117
|
+
headers: request.headers,
|
118
|
+
status: 303,
|
119
|
+
});
|
86
120
|
} catch (error) {
|
87
121
|
log('Error processing consent: %s', error instanceof Error ? error.message : 'unknown error');
|
88
122
|
console.error('Error processing consent:', error);
|
@@ -2,7 +2,7 @@ import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
|
|
2
2
|
import type { NextRequest } from 'next/server';
|
3
3
|
|
4
4
|
import { pino } from '@/libs/logger';
|
5
|
-
import { createAsyncRouteContext } from '@/
|
5
|
+
import { createAsyncRouteContext } from '@/libs/trpc/async/context';
|
6
6
|
import { asyncRouter } from '@/server/routers/async';
|
7
7
|
|
8
8
|
export const maxDuration = 60;
|
@@ -2,7 +2,7 @@ import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
|
|
2
2
|
import type { NextRequest } from 'next/server';
|
3
3
|
|
4
4
|
import { pino } from '@/libs/logger';
|
5
|
-
import {
|
5
|
+
import { createEdgeContext } from '@/libs/trpc/edge/context';
|
6
6
|
import { edgeRouter } from '@/server/routers/edge';
|
7
7
|
|
8
8
|
export const runtime = 'edge';
|
@@ -12,7 +12,7 @@ const handler = (req: NextRequest) =>
|
|
12
12
|
/**
|
13
13
|
* @link https://trpc.io/docs/v11/context
|
14
14
|
*/
|
15
|
-
createContext: () =>
|
15
|
+
createContext: () => createEdgeContext(req),
|
16
16
|
|
17
17
|
endpoint: '/trpc/edge',
|
18
18
|
|
@@ -2,7 +2,7 @@ import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
|
|
2
2
|
import type { NextRequest } from 'next/server';
|
3
3
|
|
4
4
|
import { pino } from '@/libs/logger';
|
5
|
-
import {
|
5
|
+
import { createLambdaContext } from '@/libs/trpc/lambda/context';
|
6
6
|
import { lambdaRouter } from '@/server/routers/lambda';
|
7
7
|
|
8
8
|
const handler = (req: NextRequest) =>
|
@@ -10,7 +10,7 @@ const handler = (req: NextRequest) =>
|
|
10
10
|
/**
|
11
11
|
* @link https://trpc.io/docs/v11/context
|
12
12
|
*/
|
13
|
-
createContext: () =>
|
13
|
+
createContext: () => createLambdaContext(req),
|
14
14
|
|
15
15
|
endpoint: '/trpc/lambda',
|
16
16
|
|
@@ -2,7 +2,7 @@ import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
|
|
2
2
|
import type { NextRequest } from 'next/server';
|
3
3
|
|
4
4
|
import { pino } from '@/libs/logger';
|
5
|
-
import {
|
5
|
+
import { createLambdaContext } from '@/libs/trpc/lambda/context';
|
6
6
|
import { toolsRouter } from '@/server/routers/tools';
|
7
7
|
|
8
8
|
const handler = (req: NextRequest) =>
|
@@ -10,7 +10,7 @@ const handler = (req: NextRequest) =>
|
|
10
10
|
/**
|
11
11
|
* @link https://trpc.io/docs/v11/context
|
12
12
|
*/
|
13
|
-
createContext: () =>
|
13
|
+
createContext: () => createLambdaContext(req),
|
14
14
|
|
15
15
|
endpoint: '/trpc/tools',
|
16
16
|
|
@@ -2,7 +2,7 @@ import { notFound } from 'next/navigation';
|
|
2
2
|
import { Flexbox } from 'react-layout-kit';
|
3
3
|
|
4
4
|
import FileViewer from '@/features/FileViewer';
|
5
|
-
import { createCallerFactory } from '@/libs/trpc';
|
5
|
+
import { createCallerFactory } from '@/libs/trpc/lambda';
|
6
6
|
import { lambdaRouter } from '@/server/routers/lambda';
|
7
7
|
import { PagePropsWithId } from '@/types/next';
|
8
8
|
import { getUserAuth } from '@/utils/server/auth';
|