基于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 分钟前
龙虾🦞(OpenClaw) 本地部署体验:是真变革还是旧酒装新瓶?
前端·人工智能·程序员
buhuimaren_10 分钟前
系统安全及运用
前端·chrome
什么问题13 分钟前
记一次 VisionPro +PlayMaker 项目修正
开发语言·前端·javascript
新缸中之脑16 分钟前
Chrome 146:终结专用AI浏览器?
前端·人工智能·chrome
fjh199725 分钟前
通过配置 Edge 浏览器 DoH 和 ECH 实现特定网站如linuxdo裸连访问
前端·edge
北城笑笑33 分钟前
Vue 99 ,Vue 项目代理配置规范:跨域解决、路径重写与多环境适配最佳实践( 企业级避坑指南 )
运维·前端·nginx·vue
梵得儿SHI34 分钟前
Vue3 实战:从 0 搭建企业级后台管理系统(Router+Pinia+Axios+Element Plus 全整合)
前端·javascript·vue.js·pinia状态管理·项目初始化·页面路由配置·后台首页布局
不能只会打代码36 分钟前
基于Vue 3 + Spring Boot的物联网生鲜品储运系统设计与实现(源码附有详细的文档讲解)
java·前端·vue.js·spring boot·后端·物联网·github
A923A37 分钟前
【Vue3大事件 | 项目笔记】第三天
前端·vue.js·笔记·vue·前端项目
Smoothcloud润云41 分钟前
告别 Selenium:Playwright 现代 Web 自动化测试从入门到实战
前端·人工智能·selenium·测试工具·架构·自动化