站长问「能不能跳转到酷狗 App 登录」—— 平台不允许(小程序无法启动任意原生 App),
而且即使跳过去,App 内的登录态也只在那台手机上,不会回传给服务端。
所以真正的便利做法是「凭证配一次、长期复用」:
- kugouService.kuGouFetch:cookie/token 增加 KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN
兜底读环境变量;优先级 显式传入 > 库里绑定 > 环境变量
(库里绑定的优先,所以之后想临时换一份 Cookie 仍可在后台粘一次覆盖)
- status.get.ts:bound 增加 source: 'db' | 'env' | 'none',界面能说清凭证从哪来
- deploy.yml:KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN 三处齐全
(step env: 映射 + ENV_PAYLOAD export + upsert_env_key),并用 ${VAR:-} 兜底 ——
少任何一处都会像上次那样 unbound variable 直接把部署打挂
已用脚本校验:payload 占位符/参数 23/23 对应、远端脚本 30 个变量都有来源、
两个新变量三处齐全。
57 lines
2.2 KiB
TypeScript
57 lines
2.2 KiB
TypeScript
import { db } from '~/drizzle/db'
|
||
import { systemSettings } from '~/drizzle/schema'
|
||
import { kuGouFetch } from '~~/server/services/kugouService'
|
||
|
||
export default defineEventHandler(async (event) => {
|
||
const user = event.context.user
|
||
if (!user) throw createError({ statusCode: 401, message: '未登录' })
|
||
if (!['ADMIN', 'SUPER_ADMIN'].includes(user.role))
|
||
throw createError({ statusCode: 403, message: '仅管理员可访问' })
|
||
|
||
const query = getQuery(event)
|
||
const base = String(query.baseUrl || '').trim()
|
||
|
||
if (base && !/^https?:\/\//i.test(base)) {
|
||
throw createError({ statusCode: 400, message: 'baseUrl 需要是合法的 http(s) URL' })
|
||
}
|
||
|
||
const rows = await db.select().from(systemSettings).limit(1)
|
||
const settings = rows[0] as any
|
||
const usedBase = base || settings?.kugouApiBaseUrl || process.env.KUGOU_API_BASE || ''
|
||
|
||
let serviceOk: boolean
|
||
let serviceMessage: string
|
||
let loginStatus: any = null
|
||
const envCookie = !!(process.env.KUGOU_ADMIN_COOKIE || '').trim()
|
||
const envToken = !!(process.env.KUGOU_ADMIN_TOKEN || '').trim()
|
||
try {
|
||
const r = await kuGouFetch('/login/status', { timestamp: Date.now() })
|
||
loginStatus = r
|
||
serviceOk = Number((r as any)?.status ?? 0) === 1 || !!((r as any)?.data?.profile || (r as any)?.data?.account)
|
||
serviceMessage = serviceOk ? '服务在线,且账号已绑定登录' : 'sidecar 在线,但酷狗账号未登录'
|
||
} catch (e: any) {
|
||
serviceOk = false
|
||
serviceMessage =
|
||
'无法连接 sidecar (' + usedBase + '):' + (e?.message || String(e))
|
||
}
|
||
|
||
return {
|
||
ok: true,
|
||
service: {
|
||
baseUrl: usedBase,
|
||
serviceOk,
|
||
serviceMessage,
|
||
loginStatus,
|
||
},
|
||
// 环境变量兜底(KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN):配一次永久用;库里绑定的优先
|
||
bound: {
|
||
hasToken: !!settings?.kugouAdminToken || envToken,
|
||
hasCookie: !!settings?.kugouAdminCookie || envCookie,
|
||
// 让界面能说清"这份凭证从哪来",排错时很关键
|
||
source: settings?.kugouAdminCookie || settings?.kugouAdminToken ? 'db' : envCookie || envToken ? 'env' : 'none',
|
||
boundAt: settings?.kugouAdminBoundAt || null,
|
||
user: settings?.kugouAdminUser || null,
|
||
},
|
||
}
|
||
})
|