diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index 2024ca6..31937ff 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -6,14 +6,12 @@ on: tag: description: '手动指定 Docker 标签' required: false - # dev 分支手动触发时,默认 tag 为 dev + # 手动触发时,默认 tag 为 dev default: 'dev' type: string - push: - # 监听 dev 分支的推送 - branches: [ dev ] - # 取消了 pull_request 触发,因为它通常不应该触发构建和推送镜像的操作 - # 如果确实需要,可以重新加回来 + # 已移除 push 到 dev 分支时的自动构建,仅保留手动触发 + # push: + # branches: [ dev ] # pull_request: # branches: [ dev ] diff --git a/src/app/api/telegram/login/create/route.ts b/src/app/api/telegram/login/create/route.ts index 4fcd504..704d6f7 100644 --- a/src/app/api/telegram/login/create/route.ts +++ b/src/app/api/telegram/login/create/route.ts @@ -1,4 +1,4 @@ -import { NextResponse } from 'next/server'; +import { NextRequest, NextResponse } from 'next/server'; import { createTelegramLoginSession, @@ -9,7 +9,7 @@ import { export const runtime = 'nodejs'; -export async function POST() { +export async function POST(request: NextRequest) { const config = await getTelegramConfig(); const problems = getTelegramConfigProblems(config, 'login'); if (problems.length > 0) { @@ -25,7 +25,8 @@ export async function POST() { }, { status: 400 }); } - const session = await createTelegramLoginSession(); + const userAgent = request.headers.get('user-agent') || ''; + const session = await createTelegramLoginSession(userAgent); const botUsername = config.botUsername.replace(/^@/, ''); return NextResponse.json({ token: session.token, diff --git a/src/lib/auth-cookie.ts b/src/lib/auth-cookie.ts index b4dd1cf..44eb037 100644 --- a/src/lib/auth-cookie.ts +++ b/src/lib/auth-cookie.ts @@ -45,7 +45,6 @@ export function getDeviceInfoFromUserAgent(userAgent: string): string { if (ua.includes('moontvplus')) return 'MoonTVPlus APP'; if (ua.includes('oriontv')) return 'OrionTV'; - if (ua.includes('telegram')) return 'Telegram Login'; if (ua.includes('chrome')) return 'Chrome'; if (ua.includes('firefox')) return 'Firefox'; if (ua.includes('safari')) return 'Safari'; diff --git a/src/lib/telegram.ts b/src/lib/telegram.ts index 72cd65c..8d8d01b 100644 --- a/src/lib/telegram.ts +++ b/src/lib/telegram.ts @@ -5,7 +5,10 @@ import type { NextRequest } from 'next/server'; import nodeFetch from 'node-fetch'; import type { AdminConfig } from './admin.types'; -import { generateAuthCookieValue } from './auth-cookie'; +import { + generateAuthCookieValue, + getDeviceInfoFromUserAgent, +} from './auth-cookie'; import { getConfig } from './config'; import { db, getStorage } from './db'; import { lockManager } from './lock'; @@ -64,6 +67,8 @@ interface TelegramLoginSession { username?: string; telegramUserId?: string; authToken?: string; + /** 发起登录的浏览器 User-Agent,用于设备管理展示 */ + userAgent?: string; } interface TelegramBindSession { @@ -318,12 +323,15 @@ export async function registerTelegramUser(input: { } } -export async function createTelegramLoginSession(): Promise { +export async function createTelegramLoginSession( + userAgent?: string +): Promise { const session: TelegramLoginSession = { token: randomToken(), status: 'pending', createdAt: now(), expiresAt: now() + LOGIN_TTL_MS, + userAgent: userAgent || undefined, }; await writeJson(loginSessionKey(session.token), session); return session; @@ -381,11 +389,12 @@ export async function confirmTelegramLogin(token: string, telegramUserId: string if (!binding) throw new Error('当前 Telegram 账号尚未绑定站内账号'); const role = await getUserRole(binding.username); + const deviceInfo = getDeviceInfoFromUserAgent(session.userAgent || ''); const authToken = await generateAuthCookieValue({ username: binding.username, role, includePassword: false, - deviceInfo: 'Telegram Bot Login', + deviceInfo, }); session.status = 'confirmed';