HarmonyOS NEXT | 一文搞懂 华为账号登录(获取UnionID/OpenID)

前言

随着HarmonyOS NEXT的逐渐完善,越来越多的开发者开始加入这一平台。很多时候开发者开发的相关应用都有账号系统,往往是需要用户先注册,填写邮箱电话等,复杂而繁琐。

刚开始上架了一款HarmonyOS NEXT的应用后,用户就请求接入华为账号。因此有了这一篇文章。

1. 准备

首先需要到AGC控制台,找到"我的项目"。

1.1 应用metadata中写入Client ID

点进去以后,找到应用的OAuth 2.0客户端ID(凭据)中的Client ID,复制起来。(下图的第二步)

然后在工程中entry模块的module.json5文件中,新增metadata,配置name为client_id,value为上一步获取的Client ID的值,如下所示

1.2 加入调试证书

注意的是,在上上图中的第三步,要顺便加入一个debug的证书。因为AccountKit需要验证证书,不是在应用商店下载的软件必须用debug证书进行调试,否则会有无法验证的错误。

2. 开发

这里是相对简单的,假如你已经配置好了相关的证书以后。

2.1 前端开发

这里几乎没有什么技术含量而言,直接按着官网的教程就行。详情见 使用华为登录按钮登录

这里主要就是将AccountKit获得的 authorizationCode 传给自己的服务器,服务器再去跟华为的服务器获取相关的用户 UnionId

2.1.1 基于Flutter开发的注意事项

基于 Flutter 开发的开发者可以使用这个第三方仓库 github.com/HarmonyCand...

用法就是 添加依赖:

yaml 复制代码
dependencies:
    sign_in_with_huawei: ^0.0.3

在相关的地方直接用,但这里值得注意的是需要自己写一个华为登录的Button。华为登录的Button相关要求与图片素材见 developer.huawei.com/consumer/cn...

dart 复制代码
final response = await SignInWithHuawei.instance.authById(
  forceLogin: true,
  state: "any state",
  nonce: "any nonce",
  idTokenAlg: IdTokenSignAlgorithm.PS256,
);

print(response);
// response.state
// response.authCode
// response.idToken
// response.openID
// response.unionID

2.2 服务器接口开发

这里我用的是SpringBoot,主要流程如下:

2.2.1 解析AccessToken

这里需要传入前端获得的 response.authCode, 返回一个accessToken相关的json。

java 复制代码
String obtainHuaweiAccessToken(String authCode) {
    OkHttpClient client = new OkHttpClient().newBuilder()
            .build();
    Map<String, String> params = new HashMap<>();
    params.put("grant_type", "authorization_code");
    params.put("client_id", ""); // agc控制台有
    params.put("client_secret", ""); // agc控制台有
    params.put("code", authCode);
    // 构建请求体
    FormBody.Builder formBuilder = new FormBody.Builder();
    for (Map.Entry<String, String> entry : params.entrySet()) {
        formBuilder.add(entry.getKey(), entry.getValue());
    }
    FormBody formBody = formBuilder.build();
    // 请求 URL
    String url = "https://oauth-login.cloud.huawei.com/oauth2/v3/token";
    // 创建请求
    Request request = new Request.Builder()
            .url(url)
            .post(formBody)  // 使用 FormBody 作为请求体
            .addHeader("Content-Type", "application/x-www-form-urlencoded")
            .build();
    try {
        Response response = client.newCall(request).execute();
        return response.body().string();
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
    }
    return "";
}

解析返回结果拿到accessToken

java 复制代码
String response = obtainHuaweiAccessToken(authCode);
System.out.println(response);
JSONObject job = JSONObject.parseObject(response);
String accessToken = job.getString("access_token");

2.2.2 解析华为账号id

这里我们使用解析到的accessToken,获取用户的相关信息。

java 复制代码
String parseAccessToken(String accessToken) {
    OkHttpClient client = new OkHttpClient().newBuilder()
            .build();
    Map<String, String> params = new HashMap<>();
    params.put("open_id", "OPENID");
    params.put("access_token", accessToken);
    // 构建请求体
    FormBody.Builder formBuilder = new FormBody.Builder();
    for (Map.Entry<String, String> entry : params.entrySet()) {
        formBuilder.add(entry.getKey(), entry.getValue());
    }
    FormBody formBody = formBuilder.build();
    // 请求 URL
    String url = "https://oauth-api.cloud.huawei.com/rest.php?nsp_fmt=JSON&nsp_svc=huawei.oauth2.user.getTokenInfo";
    // 创建请求
    Request request = new Request.Builder()
            .url(url)
            .post(formBody)  // 使用 FormBody 作为请求体
            .addHeader("Content-Type", "application/x-www-form-urlencoded")
            .build();
    try {
        Response response = client.newCall(request).execute();
        return response.body().string();
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
    }
    return "";
}

同样的,也是需要解析json来拿到union_id。

java 复制代码
String info = parseAccessToken(accessToken);
System.out.println(info);
JSONObject jobInfo = JSONObject.parseObject(info);
String unionIdGet = jobInfo.getString("union_id");

至此,就拿到了用户的唯一id union_id

2.2.3 注册与登录

这里就可以根据 union_id 是否在 数据库中来决定是否需要创建新的账号了,然后返回相关的用户信息给前端App。

3. 总结

接入 华为账号登录 不难,但确实也有些坑,比如一定要是调试的证书,否则是不行。下一篇文章,我们将讲解如何接入华为应用内购买。

相关推荐
梦想不只是梦与想7 小时前
鸿蒙应用api的兼容性:参数配置(二)
harmonyos·sdk版本·sdkversion
GitLqr7 小时前
Flutter 3.47 与 Dart 3.13:你必须了解的迁移指南
flutter·ios·dart
北墨NoLimit11 小时前
鸿蒙线程间通信怎么选:TaskPool、TaskGroup、LongTask 与 Worker 实战
typescript·harmonyos
程序员老刘11 小时前
跨平台开发地图 | 2026年8月
flutter·ai编程·客户端
2601_9638701813 小时前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
woshihuanglaoshi13 小时前
错题四科入库:鸿蒙错题本种子数据与复习队列效果
学习·华为·harmonyos·鸿蒙
kiros_wang14 小时前
鸿蒙ArkTS枚举实战|静态枚举、动态枚举业务选型、规范落地与避坑全解
harmonyos
凤山老林15 小时前
高保真集成测试:Spring Boot 结合 Testcontainers 的工程落地
spring boot·后端·集成测试
RuoyiOffice16 小时前
SpringBoot3+Vue3 接口访问日志实战:@ApiAccessLog 慢接口、参数脱敏与 OperateLog 如何分工
spring boot·vue3·traceid·spring boot 3·访问日志·apiaccesslog·操作日志
林三的日常16 小时前
【无标题】
java·spring boot·vscode·调试·后端开发