HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了
HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了 请问在应用设备状态检测这块功能里,生成鉴权令牌中的签名该如何用arkTS实现 在签名的这一步报错了 ,如图:
更多关于HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【背景知识】
基于服务账号生成鉴权令牌:使用应用设备状态检测服务时需要配置此章节。
【解决方案】
将完成BASE64编码后的Header字符串与Payload字符串,通过“.”进行连接,并在开发者的应用中,通过服务账号密钥文件中的private_key(华为不进行存储,请您妥善保管),使用SHA256withRSA/PSS算法对拼接的字符串签名,最后将Header,Payload以及字符串签名通过“.”进行连接,即可得到Token数据。
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util } from '@kit.ArkTS';
let base64 = new util.Base64Helper();
// 生成header
function genHeader(keyId: string) : string {
const jwtHeader: object = new Object({
'kid': keyId,
"typ": "JWT",
"alg": "PS256"
})
let strArray = new Uint8Array(buffer.from(JSON.stringify(jwtHeader)).buffer)
return base64.encodeToStringSync(strArray, util.Type.BASIC_URL_SAFE)
}
// 生成payload
function genPayload(subAccount: string): string {
const now: number = Date.now()
const jwtPayload: object = new Object({
"aud": "***",
'iss': subAccount,
'iat': now,
'exp': now + 3600,
})
let strArray = new Uint8Array(buffer.from(JSON.stringify(jwtPayload)).buffer)
return base64.encodeToStringSync(strArray, util.Type.BASIC_URL_SAFE)
}
async function pss(priKey: string, str: string) {
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA2048');
let keyPair = asyKeyGenerator.convertPemKeySync(null, priKey)
let signer = cryptoFramework.createSign('RSA2048|PSS|SHA256|MGF1_SHA256');
await signer.init(keyPair.priKey);
let signData = await signer.sign({ data : new Uint8Array(buffer.from(str).buffer)});
return signData.data
}
export async function main() {
// 服务账号密钥
const privateJson: object = new Object({
"key_id": "***",
"private_key": "***",
"sub_account": "***",
"auth_uri": "***",
"token_uri": "***",
"auth_provider_cert_uri": "***",
"client_cert_uri": "***"
})
let header = genHeader(privateJson['key_id']);
let payload = genPayload(privateJson['sub_account']);
let hap = header + '.' + payload
let signature = await pss(privateJson['private_key'], hap)
let token = hap + '.' + base64.encodeToStringSync(signature, util.Type.BASIC_URL_SAFE)
console.info(token)
}
更多关于HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next中,使用ArkTS实现应用设备状态检测生成鉴权令牌签名时,需导入@ohos.security.huks
模块。首先通过huks.generateKeyItem(keyAlias, options)
生成非对称密钥对,其中options需指定HuksKeyAlg.HUKS_ALG_RSA
或对应算法。然后调用huks.initSession(keyAlias, options)
初始化签名会话,传入包含HuksKeyDigest.HUKS_DIGEST_SHA256
等摘要算法的参数。最后使用huks.finishSession(handle, options)
完成签名操作。报错通常因密钥参数不匹配或数据格式错误导致,需检查HuksParam
中算法、填充模式等是否一致。
在HarmonyOS Next中使用ArkTS实现设备状态检测的签名生成时,常见问题通常集中在参数格式、编码方式或加密算法实现上。根据错误提示,建议按以下步骤排查:
-
检查参数拼接规范
确保参与签名的参数(如timestamp、nonce等)按字典序排序后使用&
连接,格式应为key1=value1&key2=value2
-
验证加密算法
使用[@ohos](/user/ohos).cryptoJs
的HMAC-SHA256算法时,确认密钥与数据格式匹配:import cryptoJs from '[@ohos](/user/ohos)/cryptoJs'; const signature = cryptoJs.HmacSHA256(待签名字符串, 密钥).toString(cryptoJs.enc.Base64);
-
排查特殊字符处理
- 对参数值进行URL编码(使用
encodeURIComponent
) - 避免Base64编码出现换行符,可替换
/[\r\n]+/g
为空字符串
- 对参数值进行URL编码(使用
-
检查时间戳同步
设备与服务器时间差需在允许范围内(通常±5分钟),可使用new Date().getTime()
获取毫秒级时间戳
典型实现示例:
import cryptoJs from '[@ohos](/user/ohos)/cryptoJs';
function generateSign(params: Record<string, string>, secret: string): string {
const sortedKeys = Object.keys(params).sort();
const signString = sortedKeys.map(key => `${key}=${params[key]}`).join('&');
return cryptoJs.HmacSHA256(signString, secret).toString(cryptoJs.enc.Base64);
}
若仍报错,请提供具体的错误信息或日志片段以便进一步分析。