鸿蒙 Account Kit:静默登录(五)
静默登录技术解析 华为账号静默登录技术通过设置forceLogin=false参数,在应用卸载重装或用户换机场景下,无需用户交互即可自动完成身份验证。该技术通过AccountKit获取UnionID/OpenID,业务流程包含客户端调用API获取AuthorizationCode、服务端换取AccessToken及用户信息等环节。关键点包括:1)静默模式下不强制拉起登录页面;2)需处理Token过
静默登录适用于应用卸载重装、用户换机等场景,不需要用户点击登录/注册按钮,即可自动获取用户的身份标识UnionID/OpenID,完成用户的静默登录。
一、静默登录
在应用卸载重装、用户换机等场景,如登录的华为账号与应用重装、换机前一致,应用可通过Account Kit提供的静默登录方式即不需要用户点击登录/注册按钮,即可获取用户的身份标识UnionID/OpenID,完成用户的静默登录。
| 场景 | 说明 |
|---|---|
| 应用卸载重装 | 用户重新安装应用后,无需再次登录 |
| 用户换机 | 用户更换设备后,自动登录 |
特点
-
无需用户交互:不需要用户点击登录/注册按钮
-
自动获取身份标识:获取UnionID/OpenID
-
提升用户体验:减少用户操作步骤
二、支持版本
| 设备类型 | 支持版本 |
|---|---|
| Phone | 支持 |
| Tablet | 支持 |
| PC/2in1 | 支持 |
| Wearable | 5.1.0(18)开始支持 |
| TV | 5.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 参数
| 参数 | 静默登录值 | 说明 |
|---|---|---|
forceLogin |
false |
不强制拉起登录页面,静默获取授权 |
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 注意事项
-
forceLogin必须为false:静默登录的关键参数
-
华为账号未登录处理:返回错误码1001502001,需引导用户登录
-
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天 |
| 处理方式 | 失效后,应用服务端需要通知客户端,重新调用授权接口,请求用户重新授权 |
九、四种登录方式对比
| 对比项 | 静默登录 | 自定义按钮登录 | 华为账号登录按钮 | 华为账号一键登录 |
|---|---|---|---|---|
| 用户操作 | 无需点击 | 点击自定义按钮 | 点击标准按钮 | 点击标准按钮 |
| forceLogin | false | true | - | - |
| 获取信息 | UnionID | UnionID | UnionID | 手机号+UnionID |
| 开发者类型 | 企业+个人 | 企业+个人 | 企业+个人 | 仅企业 |
| 适用场景 | 重装/换机自动登录 | UI定制需求 | 快速集成 | 需要手机号 |
静默登录通过forceLogin=false参数调用华为账号登录API,在应用卸载重装或换机场景下无需用户点击即可获取Authorization Code,服务端再用Code换取UnionID完成自动登录,适用于企业开发者和个人开发者。
更多推荐


所有评论(0)