110 lines
3.7 KiB
JavaScript
110 lines
3.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* scripts/skyeye/credential-validator.js
|
|
*
|
|
* 天眼 OAuth2 凭据校验器 (Sky-Eye Credential Validator)
|
|
*
|
|
* 功能:对 Google Drive OAuth2 环境变量执行存在性检测
|
|
* - GDRIVE_CLIENT_ID 存在性
|
|
* - GDRIVE_CLIENT_SECRET 存在性
|
|
* - GDRIVE_REFRESH_TOKEN 存在性
|
|
*
|
|
* 可作为模块 require() 使用,也可直接运行:
|
|
* GDRIVE_CLIENT_ID='...' GDRIVE_CLIENT_SECRET='...' GDRIVE_REFRESH_TOKEN='...' node credential-validator.js
|
|
*
|
|
* 守护: PER-ZY001 铸渊
|
|
* 系统: SYS-GLW-0001
|
|
* 主控: TCS-0002∞ (冰朔)
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
// OAuth2 必需环境变量
|
|
const REQUIRED_OAUTH2_VARS = [
|
|
'GDRIVE_CLIENT_ID',
|
|
'GDRIVE_CLIENT_SECRET',
|
|
'GDRIVE_REFRESH_TOKEN'
|
|
];
|
|
|
|
/**
|
|
* 验证 OAuth2 环境变量是否齐全
|
|
* @returns {{ valid: boolean, issues: string[], diagnostics: object }}
|
|
*/
|
|
function validateOAuth2Credentials() {
|
|
const result = {
|
|
valid: false,
|
|
issues: [],
|
|
diagnostics: {
|
|
auth_mode: 'oauth2',
|
|
vars_checked: REQUIRED_OAUTH2_VARS.length,
|
|
vars_present: 0,
|
|
missing_vars: []
|
|
}
|
|
};
|
|
|
|
for (const varName of REQUIRED_OAUTH2_VARS) {
|
|
const val = process.env[varName];
|
|
if (!val || val.trim().length === 0) {
|
|
result.diagnostics.missing_vars.push(varName);
|
|
result.issues.push(`Missing or empty environment variable: ${varName}`);
|
|
} else {
|
|
result.diagnostics.vars_present++;
|
|
}
|
|
}
|
|
|
|
result.valid = result.issues.length === 0;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 生成人类可读的诊断报告
|
|
* @param {object} validationResult - validateOAuth2Credentials 的返回值
|
|
* @returns {string}
|
|
*/
|
|
function formatDiagnosticReport(validationResult) {
|
|
const r = validationResult;
|
|
const lines = [];
|
|
|
|
lines.push('╔════════════════════════════════════════════════════════╗');
|
|
lines.push('║ 🛰️ 天眼 OAuth2 凭据校验报告 (Credential Audit) ║');
|
|
lines.push('╚════════════════════════════════════════════════════════╝');
|
|
lines.push('');
|
|
lines.push(`状态: ${r.valid ? '✅ 绿色信号 (PASS)' : '🔴 逻辑红区 (FAIL)'}`);
|
|
lines.push(`认证模式: OAuth2 代理人`);
|
|
lines.push(`环境变量检查: ${r.diagnostics.vars_present}/${r.diagnostics.vars_checked} 齐全`);
|
|
|
|
if (r.diagnostics.missing_vars.length > 0) {
|
|
lines.push(`缺失变量: ${r.diagnostics.missing_vars.join(', ')}`);
|
|
}
|
|
|
|
if (r.issues.length > 0) {
|
|
lines.push('');
|
|
lines.push('发现问题:');
|
|
r.issues.forEach((issue, i) => {
|
|
lines.push(` ${i + 1}. ${issue}`);
|
|
});
|
|
}
|
|
|
|
return lines.join('\n');
|
|
}
|
|
|
|
// ═══════════════════════════════════════════════
|
|
// 模块导出
|
|
// ═══════════════════════════════════════════════
|
|
|
|
module.exports = { validateOAuth2Credentials, formatDiagnosticReport, REQUIRED_OAUTH2_VARS };
|
|
|
|
// ═══════════════════════════════════════════════
|
|
// CLI 模式
|
|
// ═══════════════════════════════════════════════
|
|
|
|
if (require.main === module) {
|
|
const result = validateOAuth2Credentials();
|
|
console.log(formatDiagnosticReport(result));
|
|
console.log('');
|
|
console.log('---CREDENTIAL_AUDIT_JSON---');
|
|
console.log(JSON.stringify(result, null, 2));
|
|
|
|
process.exit(result.valid ? 0 : 1);
|
|
}
|