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. 总结

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

相关推荐
讯方洋哥4 小时前
HarmonyOS App开发——职前通应用App开发(下)
华为·harmonyos
qq_297574674 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
摘星编程6 小时前
React Native鸿蒙版:Image图片占位符
react native·react.js·harmonyos
大雷神6 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地-- 第30篇:设置与帮助系统
harmonyos
Swift社区7 小时前
HarmonyOS 自定义组件与布局实践
华为·harmonyos
tb_first8 小时前
LangChain4j简单入门
java·spring boot·langchain4j
程序员老刘·9 小时前
Android Studio Otter 3 发布:日常开发选AS还是Cursor?
flutter·android studio·ai编程·跨平台开发·客户端开发
鸿蒙开发工程师—阿辉9 小时前
让 AI 帮你编译部署鸿蒙应用:harmonyos-build-deploy Skill
华为·harmonyos
浩辉_9 小时前
Dart - 内存管理与垃圾回收(GC)深度解析
flutter·dart
盐焗西兰花9 小时前
鸿蒙学习实战之路-Reader Kit构建阅读器最佳实践
学习·华为·harmonyos