鸿蒙-华为账户一键登录

1,651 阅读4分钟

华为账号用户身份标识包含UnionID和OpenID,两者的定义与使用场景:

项目/ID类型UnionIDOpenID
定义UnionID是华为账号用户在同一个开发者账号下产品的身份ID。同一个华为账号用户,同一个开发者账号下管理的不同应用,UnionID值相同。OpenID是华为账号用户在不同类型的产品的身份ID。同一个华为账号用户,不同应用(不管是否在同一个开发者账号下),OpenID值不同。
使用场景在同一个开发者账号下标识用户的唯一性。建议使用UnionID在同一个应用下标识用户的唯一性。

如果您之前使用OpenID来关联用户数据,我们建议将用户数据关系切换成UnionID,以确保您的用户使用HarmonyOS应用后可以继承老版本的用户数据。

场景介绍

  • 获取手机号和UnionID登录,即华为账号一键登录

若应用需要同时获取手机号和UnionID,推荐使用此场景,用户仅需一次点击操作,应用即可获取用户手机号和 UnionID。 应用获取到用户手机号和UnionID后,可同时通过手机号和UnionID与应用原有用户体系进行关联

  • 静默登录

在应用卸载重装、用户换机等场景,用户无需点击登录/注册按钮即可实现静默登录。

  • 订阅华为账号登录/登出事件

当应用需要跟随华为账号的登录状态进行登录登出时,可以通过订阅华为账号的登录登出事件进行判断。

  • 仅获取UnionID登录

应用可获取华为账号用户的UnionID,通过UnionID关联应用用户。

获取手机号和UnionID登录

登录页面UX规范设计

image.png

不符合规范的UX设计可能会对应用上架和用户体验带来影响。

业务流程

image.png

流程说明:

  1. 用户打开应用后,应用传对应的scope调用AuthorizationWithHuaweiIDRequest请求获取AuthorizationWithHuaweiIDResponse响应结果。
  2. 通过响应结果判断系统华为账号是否已登录,如未登录,则应用需要展示其他登录方式;如已登录,则从响应结果中解析出UnionID、OpenID和匿名手机号。
  3. 应用查询UnionID、OpenID是否已关联用户。如已关联,结合风控、安全因素及自身业务场景判断,可展示已关联的账号,由用户选择是否使用华为账号登录应用,或免用户操作,静默登录应用;如未关联,则参考下面步骤继续开发。
  4. 判断匿名手机号是否为空,如为空,则应用需要展示其他登录方式;不为空,则设置相关参数调用LoginWithHuaweiIDButton组件拉起一键登录页面。
  5. 用户同意协议后,点击华为账号一键登录按钮,应用可以获取到Authorization Code等数据。
  6. 将获取的Authorization Code数据传给应用服务器,应用服务器通过调用获取凭证Access Token接口和获取用户信息接口获取用户完整手机号和UnionID、OpenID。
  7. 应用通过用户手机号和UnionID、OpenID完成用户关联。

权限配置

  1. 登录华为开发者联盟,选择“管理中心 > API服务 > 授权管理”。 image.png
  2. 根据应用名称和应用Client ID选择凭证名称。

image.png

  1. 服务选择“华为账号服务”,选择“敏感权限”(公开权限无需申请),再根据应用的需要,选择对应的权限,点击“申请”。

image.png

应用使用华为账号一键登录功能之前,需要完成quickLoginMobilePhone(华为账号一键登录)的scope权限申请

客户端开发

  • 导入authentication模块及相关公共模块。
import { authentication } from '@kit.AccountKit';
  • 调用authentication模块的AuthorizationWithHuaweiIDRequest请求获取华为账号用户的UnionID、OpenID、匿名手机号。匿名手机号用于登录页面展示。

  • 如未关联,再判断是否存在下面的异常场景

    • 存在如下异常场景:

      1)返回1001502001 华为账号未登录错误码,说明华为账号未登录。

      2)返回1001500003 不支持该scopes或permissions错误码,说明华为账号用户注册地非中国大陆。

      3)获取到的匿名手机号为空,说明华为账号没有绑定手机号、权限未申请或未生效。

      上述异常场景应用需要展示其他登录方式。

封装华为登录工具类

申请授权

  1. 创建HuaweiIDProvider认证服务对象
const huaweiIdProvider = new authentication.HuaweiIDProvider()
  1. 创建一个Account Kit授权请求对象
const authCreateRequest = huaweiIdProvider.createAuthorizationWithHuaweiIDRequest()
  1. 添加请求参数
authCreateRequest.scopes = ['phone']  // 用于获取用户数据
authCreateRequest.permissions = ['serviceauthcode']  // 权限列表
authCreateRequest.forceAuthorization = true  // 用户未登录或未授权,则会拉起用户登录或授权页面。
  1. 执行授权请求
const authController = new authentication.AuthenticationController(getContext())
const authResponse =
  await authController.executeRequest(authCreateRequest) as authentication.AuthorizationWithHuaweiIDResponse
  1. 获取serviceauthcode
const serviceauthcode = authResponse.data?.authorizationCode

通过调取申请授权,获取serviceauthcode传递给接口,获取用户登录信息

取消授权

  1. 创建HuaweiIDProvider认证服务对象
const huaweiIdProvider = new authentication.HuaweiIDProvider()
  1. 创建取消授权请求
const authCancelRequest = huaweiIdProvider.createCancelAuthorizationRequest()
  1. 执行授权请求
const authController = new authentication.AuthenticationController(getContext())
await authController.executeRequest(authCancelRequest)