在开发应用时,我们经常需要获取用户的头像和昵称信息。通过华为的 Account Kit,可以一键获取用户的这些信息,大大简化了用户填写个人信息的流程。本文将详细介绍如何在应用中集成这个功能。
业务流程
- 应用传递相应的 scope 调用授权 API 请求获取用户的头像和昵称。
- 如果用户已经给应用授权,开发者可以直接获取用户的头像、昵称、UnionID 和 OpenID。
- 如果用户未授权,授权请求将启动授权页面,用户确认授权后,开发者可以获得用户的头像、昵称、UnionID 和 OpenID。
- 获取到头像信息后,开发者可以通过下载该 URL 来使用该头像。
接口说明
获取头像昵称的关键接口如下表所示:
接口名 | 描述 |
---|---|
createAuthorizationWithHuaweiIDRequest(): AuthorizationWithHuaweiIDRequest | 获取授权接口,通过 AuthorizationWithHuaweiIDRequest 传入头像昵称的 scope(例如 profile )以及 Authorization Code 的 permission(例如 serviceauthcode ),即可在授权结果中获取到用户的头像、昵称、UnionID、OpenID 和 Authorization Code。 |
constructor(context?: common.Context) | 创建授权请求 Controller。 |
executeRequest(request: AuthenticationRequest): Promise<AuthenticationResponse> | 通过 Promise 方式执行授权操作。 |
头像和昵称可以从 AuthenticationResponse
的子类 AuthorizationWithHuaweiIDResponse
中解析,具体解析方法请参考客户端开发的示例代码。
注意事项
- 上述接口需在页面或自定义组件的生命周期内调用。
- 如果用户没有设置昵称,默认返回华为账号绑定的匿名手机号或邮箱。
开发前提
在进行代码开发之前,请先确认你已完成配置 Client ID 的工作。此场景无需申请 scope 权限。
开发步骤
1、导入 authentication
模块及相关公共模块。
import { authentication } from '@kit.AccountKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { util } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
2、创建授权请求并设置参数。
// 创建授权请求对象
const authRequest = new authentication.HuaweiIDProvider()
.createAuthorizationWithHuaweiIDRequest();
// 配置请求参数
authRequest.scopes = ['profile']; // 请求头像和昵称权限
authRequest.permissions = ['serviceauthcode']; // 如需服务端开发则需要此权限
authRequest.forceAuthorization = true; // 强制显示授权页面
authRequest.state = util.generateRandomUUID(); // 防止请求伪造的安全措施
3、发起授权请求并处理结果。
try {
// 创建授权控制器
const controller = new authentication.AuthenticationController(getContext(this));
// 执行授权请求
controller.executeRequest(authRequest).then((data) => {
// 转换响应数据类型
const authorizationWithHuaweiIDResponse = data as authentication.AuthorizationWithHuaweiIDResponse;
// 验证安全状态
const state = authorizationWithHuaweiIDResponse.state;
if (state != undefined && authRequest.state != state) {
console.error(`授权失败:state不匹配,响应state: ${state}`);
return;
}
// 获取用户信息
const authorizationWithHuaweiIDCredential = authorizationWithHuaweiIDResponse.data!;
// 解析所需信息
const avatarUri = authorizationWithHuaweiIDCredential.avatarUri; // 头像地址
const nickName = authorizationWithHuaweiIDCredential.nickName; // 昵称
const unionID = authorizationWithHuaweiIDCredential.unionID; // 用户唯一标识
const openID = authorizationWithHuaweiIDCredential.openID; // 应用内用户标识
const authorizationCode = authorizationWithHuaweiIDCredential.authorizationCode; // 授权码
// 处理获取到的信息
console.info('成功获取用户信息:', {
avatarUri,
nickName,
unionID,
openID,
authorizationCode
});
}).catch((err: BusinessError) => {
console.error('获取用户信息失败:', err.code, err.message);
});
} catch (error) {
console.error('发生错误:', error);
}
服务端开发(可选)
开发者根据业务需求选择是否进行服务端开发。
- 应用服务器使用 Client ID、Client Secret 和 Authorization Code 调用获取用户级凭证的接口,向华为账号服务器请求获取 Access Token 和 Refresh Token。
- 使用 Access Token 调用获取用户信息接口,从用户信息中获取用户的头像和昵称。
- Access Token 过期处理
- 由于 Access Token 的有效期仅为 60 分钟,当 Access Token 失效或即将失效时(可通过 REST API 错误码判断),可以使用 Refresh Token(有效期 180 天)通过刷新凭证向华为账号服务器请求获取新的 Access Token。
- 当 Access Token 非正常失效(如修改密码、退出账号、删除设备)时,业务可重新登录授权获取 Authorization Code,向账号服务器请求获取新的 Access Token。
- Refresh Token 过期处理
- 由于 Refresh Token 的有效期为 180 天,当 Refresh Token 失效后(可通过 REST API 错误码判断),应用服务器端需要通知客户端,重新调用授权接口,请求用户重新授权。
说明
当 Access Token 失效时,如果不使用 Refresh Token 向账号服务器请求获取新的 Access Token,账号的授权信息将会失效,导致使用 Access Token 的功能都会失败。