华为账号用户身份标识包含UnionID和OpenID,两者的定义与使用场景:
| 项目/ID类型 | UnionID | OpenID |
|---|---|---|
| 定义 | UnionID是华为账号用户在同一个开发者账号下产品的身份ID。同一个华为账号用户,同一个开发者账号下管理的不同应用,UnionID值相同。 | OpenID是华为账号用户在不同类型的产品的身份ID。同一个华为账号用户,不同应用(不管是否在同一个开发者账号下),OpenID值不同。 |
| 使用场景 | 在同一个开发者账号下标识用户的唯一性。建议使用UnionID。 | 在同一个应用下标识用户的唯一性。 |
如果您之前使用OpenID来关联用户数据,我们建议将用户数据关系切换成UnionID,以确保您的用户使用HarmonyOS应用后可以继承老版本的用户数据。
场景介绍
- 获取手机号和UnionID登录,即华为账号一键登录
若应用需要同时获取手机号和UnionID,推荐使用此场景,用户仅需一次点击操作,应用即可获取用户手机号和 UnionID。 应用获取到用户手机号和UnionID后,可同时通过手机号和UnionID与应用原有用户体系进行关联。
- 静默登录
在应用卸载重装、用户换机等场景,用户无需点击登录/注册按钮即可实现静默登录。
- 订阅华为账号登录/登出事件
当应用需要跟随华为账号的登录状态进行登录登出时,可以通过订阅华为账号的登录登出事件进行判断。
- 仅获取UnionID登录
应用可获取华为账号用户的UnionID,通过UnionID关联应用用户。
获取手机号和UnionID登录
登录页面UX规范设计
不符合规范的UX设计可能会对应用上架和用户体验带来影响。
业务流程
流程说明:
- 用户打开应用后,应用传对应的scope调用AuthorizationWithHuaweiIDRequest请求获取AuthorizationWithHuaweiIDResponse响应结果。
- 通过响应结果判断系统华为账号是否已登录,如未登录,则应用需要展示其他登录方式;如已登录,则从响应结果中解析出UnionID、OpenID和匿名手机号。
- 应用查询UnionID、OpenID是否已关联用户。如已关联,结合风控、安全因素及自身业务场景判断,可展示已关联的账号,由用户选择是否使用华为账号登录应用,或免用户操作,静默登录应用;如未关联,则参考下面步骤继续开发。
- 判断匿名手机号是否为空,如为空,则应用需要展示其他登录方式;不为空,则设置相关参数调用LoginWithHuaweiIDButton组件拉起一键登录页面。
- 用户同意协议后,点击华为账号一键登录按钮,应用可以获取到Authorization Code等数据。
- 将获取的Authorization Code数据传给应用服务器,应用服务器通过调用获取凭证Access Token接口和获取用户信息接口获取用户完整手机号和UnionID、OpenID。
- 应用通过用户手机号和UnionID、OpenID完成用户关联。
权限配置
- 登录华为开发者联盟,选择“管理中心 > API服务 > 授权管理”。
- 根据应用名称和应用Client ID选择凭证名称。
- 服务选择“华为账号服务”,选择“敏感权限”(公开权限无需申请),再根据应用的需要,选择对应的权限,点击“申请”。
应用使用华为账号一键登录功能之前,需要完成quickLoginMobilePhone(华为账号一键登录)的scope权限申请
客户端开发
- 导入authentication模块及相关公共模块。
import { authentication } from '@kit.AccountKit';
-
调用authentication模块的AuthorizationWithHuaweiIDRequest请求获取华为账号用户的UnionID、OpenID、匿名手机号。匿名手机号用于登录页面展示。
-
如未关联,再判断是否存在下面的异常场景
-
存在如下异常场景:
1)返回1001502001 华为账号未登录错误码,说明华为账号未登录。
2)返回1001500003 不支持该scopes或permissions错误码,说明华为账号用户注册地非中国大陆。
3)获取到的匿名手机号为空,说明华为账号没有绑定手机号、权限未申请或未生效。
上述异常场景应用需要展示其他登录方式。
-
封装华为登录工具类
申请授权
- 创建HuaweiIDProvider认证服务对象
const huaweiIdProvider = new authentication.HuaweiIDProvider()
- 创建一个Account Kit授权请求对象
const authCreateRequest = huaweiIdProvider.createAuthorizationWithHuaweiIDRequest()
- 添加请求参数
authCreateRequest.scopes = ['phone'] // 用于获取用户数据
authCreateRequest.permissions = ['serviceauthcode'] // 权限列表
authCreateRequest.forceAuthorization = true // 用户未登录或未授权,则会拉起用户登录或授权页面。
- 执行授权请求
const authController = new authentication.AuthenticationController(getContext())
const authResponse =
await authController.executeRequest(authCreateRequest) as authentication.AuthorizationWithHuaweiIDResponse
- 获取serviceauthcode
const serviceauthcode = authResponse.data?.authorizationCode
通过调取申请授权,获取serviceauthcode传递给接口,获取用户登录信息
取消授权
- 创建HuaweiIDProvider认证服务对象
const huaweiIdProvider = new authentication.HuaweiIDProvider()
- 创建取消授权请求
const authCancelRequest = huaweiIdProvider.createCancelAuthorizationRequest()
- 执行授权请求
const authController = new authentication.AuthenticationController(getContext())
await authController.executeRequest(authCancelRequest)