From 3171918c74ddf0f40c92f035a285866c9df8cda9 Mon Sep 17 00:00:00 2001 From: XiaoshuangMa Date: Mon, 17 Jan 2022 18:28:53 +0800 Subject: [PATCH] add readme. Signed-off-by: XiaoshuangMa --- README.en.md | 36 ------------ README.md | 39 ++++++------- README_ZH.md | 97 +++++++++++++++++++++++++++++++++ figures/统一用户认证架构图.png | Bin 0 -> 24621 bytes 4 files changed, 115 insertions(+), 57 deletions(-) delete mode 100644 README.en.md create mode 100644 README_ZH.md create mode 100644 figures/统一用户认证架构图.png diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 68983bc..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# useriam_userauth - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index b2e2359..68983bc 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,36 @@ # useriam_userauth -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} -#### 软件架构 -软件架构说明 +#### Software Architecture +Software architecture description - -#### 安装教程 +#### Installation 1. xxxx 2. xxxx 3. xxxx -#### 使用说明 +#### Instructions 1. xxxx 2. xxxx 3. xxxx -#### 参与贡献 +#### Contribution -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request -#### 特技 +#### Gitee Feature -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README_ZH.md b/README_ZH.md new file mode 100644 index 0000000..57d8274 --- /dev/null +++ b/README_ZH.md @@ -0,0 +1,97 @@ +# useriam_userauth + +- [简介](#简介) +- [目录](#目录) +- [编译构建](#编译构建) + - [准备](#准备) + - [获取源码](#获取源码) + - [编译构建](#编译构建) + +- [说明](#说明) + - [接口说明](#接口说明) + - [使用说明](#使用说明) +- [相关仓](#相关仓) + + +## 简介 + +**统一用户认证(userauth)**是用户IAM子系统的基础部件之一,对外提供统一用户身份认证功能,并且开放生物特征认证API给三方应用调用。 + +**图1** 统一用户认证架构图 + +口令认证架构图 + + + +用户认证接口支持针对目标用户完成达到目标认证结果可信等级(ATL)的用户身份认证。其中目标ATL由业务指定,目标用户id可以由业务指定(系统服务或系统基础应用),也可以从系统上下文获取(三方应用)。 + +## 目录 + +```undefined +//base/user_iam/user_auth +├── ohos.build # 组件描述文件 +├── userauth.gni # 构建配置 +├── frameworks # 框架代码 +├── interfaces # 对外接口存放目录 +│ ├── innerkits # 对内部子系统暴露的头文件,供系统服务使用 +│ └── kits # 对三方应用暴露的头文件 +├── sa_profile # Service Ability 配置文件 +├── services # Service Ability 服务实现 +├── test # 测试代码存放目录 +└── utils # 测试代码存放目录 +``` + +## 编译构建 + + +### 准备 + +开发者需要在Linux上搭建编译环境: + +- [Ubuntu编译环境准备](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md) +- Hi3518EV300单板:参考[环境搭建](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-setting.md) +- Hi3516DV300单板:参考[环境搭建](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-setting.md) + +### 获取源码 + +在Linux服务器上下载并解压一套源代码,源码获取方式参考[源码获取](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md)。 + +### 编译构建 + +开发者开发第一个应用程序可参考: + +- [helloworld for Hi3518EV300](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-running.md) + +- [helloworld for Hi3516DV300](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-running.md) + + +## 说明 + +### 接口说明 + +**表1** API + +| 接口名 | 描述 | +| ------ | -------------------------------- | +| getAvailabeStatus(authType : AuthType, authTrustLevel : AuthTurstLevel) : number; | 指定ATL,查询是否支持目标认证方式 | +| auth(challenge: BigInt, authType : AuthType, authTrustLevel: AuthTurstLevel, callback: IUserAuthCallback): BigInt; | 指定ATL和认证方式,完成用户身份认证 | + +### 使用说明 + +厂商在对接统一用户认证框架时,需要在可信执行环境中实现以下两个功能点: + +1. 认证方案生成:根据目标用户录入的认证凭据和目标认证安全等级,决策用户身份认证方案; +2. 认证结果评估:根据执行器返回的身份认证结果,评估是否达到目标认证安全等级。 + +## 相关仓 + +[useriam_coauth](https://gitee.com/openharmony-sig/useriam_coauth) + +[useriam_useridm](https://gitee.com/openharmony-sig/useriam_useridm) + +**[useriam_userauth](https://gitee.com/openharmony-sig/useriam_userauth)** + +[useriam_pinauth](https://gitee.com/openharmony-sig/useriam_pinauth) + +[useriam_faceauth](https://gitee.com/openharmony/useriam_faceauth) + diff --git a/figures/统一用户认证架构图.png b/figures/统一用户认证架构图.png new file mode 100644 index 0000000000000000000000000000000000000000..69107ae83c30a16dea0c6b2c364a28f4ced70137 GIT binary patch literal 24621 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