From 8efa992e2112fe6215ef2e23f02356f63bdb328b Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Mon, 10 Aug 2026 15:57:35 +0800 Subject: [PATCH] feat(mobile-h5): add RSA login body builder with jsencrypt Co-authored-by: Cursor --- mobile-h5/package-lock.json | 9 ++++++++- mobile-h5/package.json | 3 ++- mobile-h5/utils/login-rsa.js | 27 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 mobile-h5/utils/login-rsa.js diff --git a/mobile-h5/package-lock.json b/mobile-h5/package-lock.json index 77565ec3..8e39d9ac 100644 --- a/mobile-h5/package-lock.json +++ b/mobile-h5/package-lock.json @@ -8,7 +8,8 @@ "name": "mobile-h5", "version": "1.0.0", "dependencies": { - "@vant/weapp": "^1.11.7" + "@vant/weapp": "^1.11.7", + "jsencrypt": "^3.5.4" } }, "node_modules/@vant/weapp": { @@ -16,6 +17,12 @@ "resolved": "https://registry.npmmirror.com/@vant/weapp/-/weapp-1.11.7.tgz", "integrity": "sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==", "license": "MIT" + }, + "node_modules/jsencrypt": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.5.4.tgz", + "integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==", + "license": "MIT" } } } diff --git a/mobile-h5/package.json b/mobile-h5/package.json index 26f752ca..2f49a97b 100644 --- a/mobile-h5/package.json +++ b/mobile-h5/package.json @@ -4,6 +4,7 @@ "private": true, "description": "zkxw mobile uni-app (HBuilderX) + Vant Weapp", "dependencies": { - "@vant/weapp": "^1.11.7" + "@vant/weapp": "^1.11.7", + "jsencrypt": "^3.5.4" } } diff --git a/mobile-h5/utils/login-rsa.js b/mobile-h5/utils/login-rsa.js new file mode 100644 index 00000000..61e5ed55 --- /dev/null +++ b/mobile-h5/utils/login-rsa.js @@ -0,0 +1,27 @@ +import JSEncrypt from 'jsencrypt' +import { get } from './request.js' + +/** + * 对齐 web-admin `buildWebEncryptedLoginBody`: + * 拉公钥后加密 { username, password, ts }。 + * @returns {Promise<{ encryptedLogin: string }>} + */ +export async function buildEncryptedLoginBody(username, password) { + const data = await get('/web/auth/login-rsa-public-key') + const publicKeyPem = data && data.publicKeyPem + if (!publicKeyPem) { + throw new Error('获取登录公钥失败') + } + const crypt = new JSEncrypt() + crypt.setPublicKey(publicKeyPem) + const payload = JSON.stringify({ + username, + password, + ts: Date.now() + }) + const encryptedLogin = crypt.encrypt(payload) + if (!encryptedLogin) { + throw new Error('登录加密失败,请重试') + } + return { encryptedLogin } +}