鸿蒙 Account Kit:静默登录(五)

静默登录适用于应用卸载重装、用户换机等场景,不需要用户点击登录/注册按钮,即可自动获取用户的身份标识UnionID/OpenID,完成用户的静默登录。

一、静默登录

在应用卸载重装、用户换机等场景,如登录的华为账号与应用重装、换机前一致,应用可通过Account Kit提供的静默登录方式即不需要用户点击登录/注册按钮,即可获取用户的身份标识UnionID/OpenID,完成用户的静默登录。

场景说明
应用卸载重装用户重新安装应用后,无需再次登录
用户换机用户更换设备后,自动登录

特点

  • 无需用户交互:不需要用户点击登录/注册按钮

  • 自动获取身份标识:获取UnionID/OpenID

  • 提升用户体验:减少用户操作步骤

二、支持版本

设备类型支持版本
Phone支持
Tablet支持
PC/2in1支持
Wearable5.1.0(18)开始支持
TV5.1.1(19)开始支持

三、业务流程

阶段说明
调用登录API用户使用华为账号登录过应用,应用卸载重装或换机后再进入应用时,应用传forceLogin = false等参数调用登录API。如华为账号已登录且API调用成功,获取Authorization Code;如华为账号未登录,返回错误码1001502001
用户关联应用账号服务端通过Authorization Code获取Access Token,再获取UnionID,应用完成静默登录

通过Authorization Code凭证获取用户信息可以有效避免黑客通过数据遍历、身份伪造、重放攻击等手段导致的安全风险。

四、开发前提

在进行代码开发前,请确保已完成:

配置项说明
配置签名和指纹参考配置签名和指纹
配置Client ID参考配置Client ID

注意:此场景无需申请账号权限。

五、接口

接口描述
createLoginWithHuaweiIDRequest()创建账号登录请求。forceLogin参数静默登录场景设置为false
constructor(context)创建登录请求Controller
executeRequest(request)通过Promise方式执行登录操作

注意:上述接口需在页面或自定义组件生命周期内调用。

六、客户端开发

6.1 导入模块

import { authentication } from '@kit.AccountKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { util } from '@kit.ArkTS'; import { BusinessError } from '@kit.BasicServicesKit';

6.2 错误码枚举

export enum ErrorCode { ERROR_CODE_LOGIN_OUT = 1001502001, // 账号未登录 ERROR_CODE_NETWORK_ERROR = 1001502005, // 网络错误 ERROR_CODE_INTERNAL_ERROR = 1001502009, // 内部错误 ERROR_CODE_USER_CANCEL = 1001502012, // 用户取消授权 ERROR_CODE_SYSTEM_SERVICE = 12300001, // 系统服务异常 ERROR_CODE_REQUEST_REFUSE = 1001500002 // 重复请求 }

6.3 创建登录请求并执行

// 创建登录请求,并设置参数 const loginRequest = new authentication.HuaweiIDProvider() .createLoginWithHuaweiIDRequest(); // false表示静默登录(重要) loginRequest.forceLogin = false; // 用于防跨站点请求伪造 loginRequest.state = util.generateRandomUUID(); // 执行登录请求 try { const controller = new authentication.AuthenticationController(); controller.executeRequest(loginRequest).then((response: authentication.LoginWithHuaweiIDResponse) => { const state = response.state; if (state && loginRequest.state !== state) { hilog.error(0x0000, 'testTag', `The state is different, response state: ${state}`); return; } hilog.info(0x0000, 'testTag', 'Succeeded in logging in.'); const code = response?.data?.authorizationCode; // 开发者处理code(传给服务端) }).catch((error: BusinessError) => { dealAllError(error); }); } catch (error) { dealAllError(error); }

6.4 参数

参数静默登录值说明
forceLoginfalse不强制拉起登录页面,静默获取授权
state随机UUID防跨站点请求伪造

6.5 错误处理函数

function dealAllError(error: BusinessError): void { hilog.error(0x0000, 'testTag', `Failed to login. Code: ${error.code}, message: ${error.message}`); if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) { // 用户未登录华为账号,请登录华为账号并重试或使用其他方式登录 } else if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) { // 网络异常,请检查当前网络状态并重试 } else if (error.code === ErrorCode.ERROR_CODE_INTERNAL_ERROR) { // 登录失败,请尝试使用其他方式登录 } else if (error.code === ErrorCode.ERROR_CODE_USER_CANCEL) { // 用户取消授权 } else if (error.code === ErrorCode.ERROR_CODE_SYSTEM_SERVICE) { // 系统服务异常,请稍后重试 } else if (error.code === ErrorCode.ERROR_CODE_REQUEST_REFUSE) { // 重复请求,应用无需处理 } else { // 应用登录失败,请尝试使用其他方式登录 } }

七、服务端开发

7.1 获取Access Token

应用服务端使用Client ID、Client Secret、Authorization Code调用获取用户级凭证接口向华为账号服务器请求获取Access Token、Refresh Token。

7.2 获取UnionID

使用Access Token调用解析凭证接口获取用户的UnionID。

7.3 用户关联

应用通过查询获取的UnionID判断该用户是否已关联:

  • 已关联:完成用户登录

  • 未关联:创建新用户,绑定UnionID,完成用户登录

7.4 业务流程

应用启动(重装/换机后) ↓ 创建LoginWithHuaweiIDRequest ↓ 设置forceLogin=false ↓ 调用executeRequest执行静默登录 ↓ 如华为账号已登录 → 获取Authorization Code 如华为账号未登录 → 返回错误码1001502001 ↓ 服务端用Authorization Code换取Access Token ↓ 用Access Token获取UnionID ↓ 根据UnionID关联用户,完成静默登录

7.5 注意事项

  1. forceLogin必须为false:静默登录的关键参数

  2. 华为账号未登录处理:返回错误码1001502001,需引导用户登录

  3. Token管理:注意Access Token和Refresh Token的有效期

八、Token过期处理

项目说明
有效期60分钟
处理方式使用Refresh Token(有效期180天)通过刷新用户级凭证接口获取新的Access Token

备注:当Access Token失效时,若应用不使用Refresh Token获取新的Access Token,账号的授权信息将会失效,导致使用Access Token的功能都会失败。

Access Token非正常失效场景

当Access Token非正常失效(如修改密码、退出账号、删除设备)时,应用可重新登录授权获取Authorization Code,向华为账号服务器请求获取新的Access Token。

Refresh Token过期处理

项目说明
有效期180天
处理方式失效后,应用服务端需要通知客户端,重新调用授权接口,请求用户重新授权

九、四种登录方式对比

对比项静默登录自定义按钮登录华为账号登录按钮华为账号一键登录
用户操作无需点击点击自定义按钮点击标准按钮点击标准按钮
forceLoginfalsetrue--
获取信息UnionIDUnionIDUnionID手机号+UnionID
开发者类型企业+个人企业+个人企业+个人仅企业
适用场景重装/换机自动登录UI定制需求快速集成需要手机号

静默登录通过forceLogin=false参数调用华为账号登录API,在应用卸载重装或换机场景下无需用户点击即可获取Authorization Code,服务端再用Code换取UnionID完成自动登录,适用于企业开发者和个人开发者。