165 lines
4.7 KiB
JavaScript
165 lines
4.7 KiB
JavaScript
const axios = require('axios');
|
|
const CryptoJS = require('crypto-js');
|
|
const NodeRSA = require('node-rsa');
|
|
|
|
/**
|
|
* 🚀 快速Token获取器
|
|
* 按照用户指定的Header格式进行登录获取Token
|
|
*/
|
|
|
|
// 配置
|
|
const CONFIG = {
|
|
url: 'http://localhost/dev-api/auth/login',
|
|
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
|
|
tenantId: '000000',
|
|
referer: 'http://localhost/login?redirect=%252Findex',
|
|
rsaKey: 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==',
|
|
};
|
|
|
|
// 登录凭据
|
|
const CREDENTIALS = {
|
|
username: 'admin',
|
|
password: 'admin123',
|
|
};
|
|
|
|
/**
|
|
* 快速获取Token
|
|
*/
|
|
async function getToken(username = CREDENTIALS.username, password = CREDENTIALS.password) {
|
|
try {
|
|
console.log('🔑 正在获取Token...');
|
|
|
|
// 1. 生成AES密钥
|
|
const aesKey = generateAESKey();
|
|
|
|
// 2. 准备数据
|
|
const data = {
|
|
tenantId: CONFIG.tenantId,
|
|
username: username,
|
|
password: password,
|
|
clientId: CONFIG.clientId,
|
|
grantType: 'password',
|
|
};
|
|
|
|
// 3. 加密数据
|
|
const encryptedData = aesEncrypt(JSON.stringify(data), aesKey);
|
|
const encryptedKey = rsaEncrypt(aesKey);
|
|
|
|
// 4. 设置Header
|
|
const headers = {
|
|
'Content-Type': 'application/json;charset=utf-8',
|
|
clientid: CONFIG.clientId,
|
|
'encrypt-key': encryptedKey,
|
|
referer: CONFIG.referer,
|
|
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
isToken: 'false',
|
|
isEncrypt: 'true',
|
|
repeatSubmit: 'false',
|
|
};
|
|
|
|
// 5. 发送请求
|
|
const response = await axios.post(CONFIG.url, encryptedData, { headers, timeout: 10000 });
|
|
|
|
// 6. 返回Token
|
|
if (response.data.code === 200 && response.data.data?.access_token) {
|
|
const token = response.data.data.access_token;
|
|
console.log('✅ Token获取成功!');
|
|
console.log('🎫 Token:', token);
|
|
return token;
|
|
} else {
|
|
throw new Error(response.data.msg || 'Unknown error');
|
|
}
|
|
} catch (error) {
|
|
console.error('❌ 获取Token失败:', error.response?.data?.msg || error.message);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成AES密钥
|
|
*/
|
|
function generateAESKey() {
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
let result = '';
|
|
for (let i = 0; i < 32; i++) {
|
|
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* AES加密
|
|
*/
|
|
function aesEncrypt(data, key) {
|
|
const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
|
|
return CryptoJS.AES.encrypt(data, keyUtf8, {
|
|
mode: CryptoJS.mode.ECB,
|
|
padding: CryptoJS.pad.Pkcs7,
|
|
}).toString();
|
|
}
|
|
|
|
/**
|
|
* RSA加密
|
|
*/
|
|
function rsaEncrypt(aesKey) {
|
|
const pemKey = `-----BEGIN PUBLIC KEY-----\n${CONFIG.rsaKey}\n-----END PUBLIC KEY-----`;
|
|
const rsaKey = new NodeRSA(pemKey);
|
|
rsaKey.setOptions({ encryptionScheme: 'pkcs1' });
|
|
const aesKeyBase64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(aesKey));
|
|
return rsaKey.encrypt(aesKeyBase64, 'base64');
|
|
}
|
|
|
|
/**
|
|
* 使用Token调用API示例
|
|
*/
|
|
async function callAPIWithToken(token, apiPath) {
|
|
try {
|
|
const response = await axios.get(`http://localhost/dev-api${apiPath}`, {
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
clientid: CONFIG.clientId,
|
|
referer: CONFIG.referer,
|
|
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
},
|
|
timeout: 10000,
|
|
});
|
|
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('API调用失败:', error.response?.data?.msg || error.message);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// 导出函数
|
|
module.exports = {
|
|
getToken,
|
|
callAPIWithToken,
|
|
CONFIG,
|
|
CREDENTIALS,
|
|
};
|
|
|
|
// 直接运行
|
|
if (require.main === module) {
|
|
console.log('🚀 快速Token获取器');
|
|
console.log('='.repeat(40));
|
|
|
|
getToken().then(async (token) => {
|
|
if (token) {
|
|
console.log('\n💡 使用示例:');
|
|
console.log(`const token = "${token.substring(0, 50)}...";`);
|
|
console.log('// 使用这个Token调用其他API');
|
|
|
|
// 示例:获取用户信息
|
|
console.log('\n🧪 测试API调用...');
|
|
const userInfo = await callAPIWithToken(token, '/system/user/getInfo');
|
|
if (userInfo && userInfo.code === 200) {
|
|
console.log('✅ API调用成功! 用户:', userInfo.data.user.nickName);
|
|
}
|
|
|
|
console.log('\n='.repeat(40));
|
|
console.log('🎯 Token已保存到变量中,可以直接使用!');
|
|
}
|
|
});
|
|
}
|