feat: 优化 Gemini OAuth 授权流程,使用固定的 localhost 回调地址

- 将 Gemini OAuth 回调地址固定为 http://localhost:45462
- 更新前端提示文字为"复制oauth后的链接"
- 实现自动提取 localhost:45462 链接中的 code 参数功能
- 删除不再需要的 web/auth_gemini 路由
- 添加详细的用户操作说明和错误处理提示
- 支持两种输入方式:完整链接或仅授权码

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-22 11:42:54 +08:00
parent ed99043127
commit 11318c22b0
4 changed files with 74 additions and 192 deletions

View File

@@ -406,10 +406,8 @@ router.post('/gemini-accounts/generate-auth-url', authenticateAdmin, async (req,
try {
const { state } = req.body;
// 构建 redirect_uri使用当前服务的地址
const protocol = req.protocol;
const host = req.get('host');
const redirectUri = `${protocol}://${host}/web/auth_gemini`;
// 使用固定的 localhost:45462 作为回调地址
const redirectUri = 'http://localhost:45462';
logger.info(`Generating Gemini OAuth URL with redirect_uri: ${redirectUri}`);
@@ -420,7 +418,7 @@ router.post('/gemini-accounts/generate-auth-url', authenticateAdmin, async (req,
await redis.setOAuthSession(sessionId, {
state: authState,
type: 'gemini',
redirectUri, // 保存 redirect_uri 用于 token 交换
redirectUri: redirectUri, // 保存固定的 redirect_uri 用于 token 交换
createdAt: new Date().toISOString()
});
@@ -470,15 +468,9 @@ router.post('/gemini-accounts/exchange-code', authenticateAdmin, async (req, res
return res.status(400).json({ error: 'Authorization code is required' });
}
// 如果提供了 sessionId从会话中获取 redirect_uri
let redirectUri = null;
if (sessionId) {
const oauthSession = await redis.getOAuthSession(sessionId);
if (oauthSession && oauthSession.redirectUri) {
redirectUri = oauthSession.redirectUri;
logger.info(`Using redirect_uri from session: ${redirectUri}`);
}
}
// 使用固定的 localhost:45462 作为 redirect_uri
const redirectUri = 'http://localhost:45462';
logger.info(`Using fixed redirect_uri: ${redirectUri}`);
const tokens = await geminiAccountService.exchangeCodeForTokens(code, redirectUri);