基于AssetStoreKit实现免密登录鸿蒙示例代码

本文原创发布在华为开发者社区。

介绍

本示例基于Asset Store Kit关键资产存储服务提供的关键资产信息存储能力,实现了一个免密登录的场景,通过将用户的账户密码存储为关键资产信息,来实现 记住账户密码的效果,从而实现用户免密登录。

基于AssetStoreKit实现免密登录源码链接

效果预览

使用说明

  1. 本案例功能仅能在真机上使用,测试时请使用真机。
  2. 使用前请设置手机锁屏密码,关键资产服务需要进行机主身份验证,需要锁屏密码。
  3. 运行项目前,请执行 ohpm install @ohos/hamock,下载hamock依赖。

实现思路

在进行登录时,用户可根据需要来选择是否记住账户密码,当选择记住账户密码时,此时需要在登录时存储用户输入的账户密码,如下

typescript 复制代码
static async saveAccount (accountName: string, accountPassword: string) {
  const attrInfo = AccountStoreUtils.getAccountLoginInfo(accountName, accountPassword);
  try {
    await asset.add(attrInfo);
  } catch (e) {
    hilog.error(domainId, TAG, `保存帐号失败 ${e.code} ${e.message}`);
    return;
  }

  promptAction.showToast({
    message: '已记住密码,请重新进入该页面,会自动填充账号信息'
  })
  hilog.info(domainId, TAG, `保存密码成功`)
}

账户密码信息记录完成后,下次再来登录时,根据存储的账户密码信息自动填充即可,如下:

typescript 复制代码
static async queryAccountInfo (token: Uint8Array, challenge: Uint8Array) {
  const query: asset.AssetMap = new Map()
  query.set(asset.Tag.ALIAS, AccountStoreUtils.stringToBuffer(AccountStoreUtils.accountAlias))
  query.set(asset.Tag.AUTH_TOKEN, token)
  query.set(asset.Tag.AUTH_CHALLENGE, challenge)
  query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL)
  let accountInfo: IAccountInfo | undefined = undefined;
  try {
    const data: Array<asset.AssetMap> = await asset.query(query)
    if (data.length) {
      const map = data.shift()! as asset.AssetMap
      const secret = map.get(asset.Tag.SECRET) as Uint8Array
      accountInfo = JSON.parse(AccountStoreUtils.bufferToString(secret))
    } else {
      hilog.error(domainId, TAG, `没有查询到数据`)
    }
  } catch (e) {
    hilog.error(domainId, TAG, `查询${AccountStoreUtils.accountAlias}数据失败,错误码:${e.code},${e.message}`)
  }
  return accountInfo;
}

不过资产信息在获取前,需要进行用户的身份验证:

typescript 复制代码
// step1 通过用户认证才能访问的账号信息,要先preQuery获取challenge
// step2 拉起用户认证
// step3 通过token查询数据
// step4 调用postQuery结束查询过程
static async preAccountInfo () {
  const queryInfo: asset.AssetMap = new Map()
  queryInfo.set(asset.Tag.ALIAS, AccountStoreUtils.stringToBuffer(AccountStoreUtils.accountAlias))
  // 用户认证token有效期30s
  queryInfo.set(asset.Tag.AUTH_VALIDITY_PERIOD, 30)
  try {
    // step1
    const challenge = await asset.preQuery(queryInfo)
    // step2
    AccountStoreUtils.startUserAuth(challenge)
  } catch (e) {
    hilog.error(domainId, TAG, `查询账号登录信息失败 ${e.code} ${e.message}`)
  }
}

具体代码请参考AccountStoreUtils

相关推荐
陈随易3 分钟前
一个网吧网管,做了个网页,卖了 5000 万
前端·后端·程序员
jktantan8 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
2601_962885729 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel10 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓10 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人10 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every10 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad11 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新11 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易12 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员