以下是实现静默登录的完整步骤和代码示例:
一、静默登录实现原理
通过华为账号的静默登录能力,在用户首次登录后,后续打开应用时无需重复登录操作。核心实现逻辑:
- 首次登录 :用户主动授权,获取
Authorization Code并持久化存储。 - 后续启动:检查本地存储的登录状态,若已登录则直接使用缓存的凭证获取用户信息,实现无感登录。
二、关键代码实现
1. 配置华为账号Kit
在module.json5中配置华为账号的client_id和签名证书:
{
"module": {
"abilities": [
{
"name": ".MainAbility",
"description": "Main Ability",
"capabilities": [
"capability:account"
]
}
],
"reqPermissions": [
{
"name": "com.huawei.account.HW_ACCOUNT"
}
]
},
"account": {
"client_id": "YOUR_CLIENT_ID", // 替换为华为云控制台申请的Client ID
"certificate_hash": "YOUR_CERT_HASH" // 应用签名证书哈希值
}
}
2. 静默登录核心代码
在应用启动时(如MainAbility.ets)检查登录状态并触发静默登录:
import { authentication } from '@kit.AccountKit';
import { PersistentStorage } from '@ohos.data.persistentStorage';
import { AppStorage } from '@ohos.app.storage';
@Entry
@Component
struct Index {
@State isLogin: boolean = false;
@State userToken: string = '';
aboutToAppear() {
// 1. 从本地存储读取登录状态
PersistentStorage.getItem('isLogin').then((value) => {
this.isLogin = value as boolean;
if (this.isLogin) {
// 2. 若已登录,直接获取用户信息
this.silentLogin();
}
});
}
// 静默登录方法
silentLogin() {
const loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
loginRequest.forceLogin = false; // 关键参数:静默登录
const controller = new authentication.AuthenticationController();
controller.executeRequest(loginRequest).then((response) => {
if (response.resultCode === 0) {
// 获取Authorization Code
const authCode = response.authorizationCode;
// 3. 将Authorization Code传递给服务端换取用户信息
this.fetchUserInfo(authCode);
} else {
// 处理错误(如用户未登录华为账号)
this.handleLoginError(response.errorCode);
}
});
}
// 服务端交互示例(需自行实现)
fetchUserInfo(authCode: string) {
// 调用服务端接口,传入authCode获取Access Token和用户信息
// ...
// 更新本地状态
AppStorage.set('isLogin', true);
AppStorage.set('userToken', 'USER_TOKEN_FROM_SERVER');
}
handleLoginError(code: number) {
switch (code) {
case 1001502001:
promptAction.showToast({ message: '请先登录华为账号' });
break;
case 1001502005:
promptAction.showToast({ message: '网络异常,请检查网络' });
break;
default:
promptAction.showToast({ message: '登录失败' });
}
}
// 用户手动触发登录(可选)
async manualLogin() {
// 跳转到登录页面或调用显式登录接口
}
}
3. 状态同步与持久化
使用AppStorage实现全局状态同步,确保组件实时获取登录状态:
import { AppStorage } from '@ohos.app.storage';
// 在组件中
@State isLogin: boolean = AppStorage.get('isLogin') || false;
三、关键注意事项
- 配置Client ID :必须在华为云控制台申请并正确配置
client_id。 - 签名证书 :确保
certificate_hash与应用的签名证书一致。 - API版本:静默登录需HarmonyOS 5.0.4+和ArkUI 12+支持。
- 错误处理:需处理用户未登录华为账号、网络异常等场景。
四、完整示例代码
// MainAbility.ets
import { authentication } from '@kit.AccountKit';
import { PersistentStorage } from '@ohos.data.persistentStorage';
import { AppStorage } from '@ohos.app.storage';
@Entry
@Component
struct Index {
@State isLogin: boolean = false;
@State userToken: string = '';
aboutToAppear() {
this.checkLoginStatus();
}
checkLoginStatus() {
PersistentStorage.getItem('isLogin').then((value) => {
this.isLogin = value as boolean;
if (this.isLogin) {
this.silentLogin();
}
});
}
silentLogin() {
const loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
loginRequest.forceLogin = false;
const controller = new authentication.AuthenticationController();
controller.executeRequest(loginRequest).then((response) => {
if (response.resultCode === 0) {
const authCode = response.authorizationCode;
this.fetchUserInfo(authCode);
} else {
this.handleLoginError(response.errorCode);
}
});
}
fetchUserInfo(authCode: string) {
// 示例:调用服务端接口
// 这里需替换为实际的服务端请求逻辑
myServerApi.exchangeAuthCode(authCode).then((userInfo) => {
AppStorage.set('userToken', userInfo.token);
AppStorage.set('isLogin', true);
});
}
handleLoginError(code: number) {
let message = '登录失败';
switch (code) {
case 1001502001:
message = '请先登录华为账号';
break;
case 1001502005:
message = '网络异常';
break;
}
promptAction.showToast({ message });
}
build() {
Column() {
Text('当前状态:' + (this.isLogin ? '已登录' : '未登录'))
.fontSize(20)
.textAlign(TextAlign.Center)
.padding(20);
Button('手动登录')
.onClick(() => this.manualLogin())
.visibility(this.isLogin ? 'hidden' : 'visible');
}
.width('100%')
.height('100%')
.backgroundColor('#FFFFFF');
}
}
五、调试与验证
-
真机测试:使用华为手机/平板运行应用,确保华为账号已登录。
-
日志查看 :通过
hilog输出调试信息:import { hilog } from '@kit.BasicServicesKit'; hilog.info(0x0000, 'TAG', '登录状态:' + this.isLogin); -
服务端验证 :检查服务端是否收到有效的
Authorization Code。
通过以上步骤,即可实现应用卸载重装、换机后自动静默登录的功能。若需进一步优化用户体验,可结合Checkbox组件实现静默登录开关(参考文档中的PersistentStorage示例)。