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

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

相关推荐
木木子2213 分钟前
# 密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈
mysql·算法·华为·正则表达式·harmonyos
星释5 小时前
鸿蒙智能体开发实战:6.A2A 模式开发接口
华为·harmonyos·鸿蒙·智能体
澹然疏离5 小时前
HarmonyOS应用《民族图鉴》开发第34篇:TTSEngineService——语音引擎封装与降级策略
华为·harmonyos
花开彼岸天~6 小时前
03 module.json5 配置文件全解:能力声明、权限申请与设备支持
华为·harmonyos·鸿蒙系统
ZZZMMM.zip6 小时前
基于鸿蒙HarmonyOS NEXT开发AI股票分析应用:智能投资新体验与鸿蒙Flutter框架跨端实践
人工智能·flutter·华为·harmonyos·鸿蒙
花开彼岸天~8 小时前
04 oh-package.json5 与依赖管理:ohpm 包管理器全解析
华为·harmonyos·鸿蒙系统
Listen·Rain9 小时前
提示词和提示词模板
java·人工智能·spring boot
爸爸6199 小时前
06 项目目录结构与编码规范:三层架构与 DAO 模式实践
华为·架构·harmonyos·鸿蒙系统
不才难以繁此生10 小时前
HarmonyOS 端侧应用实战:中式美食如何把资源、路由、存储和视频拆菜串成一条工程链路
harmonyos·arkts·arkui·中式美食·端侧应用
爸爸61910 小时前
07 ArkTS 基础类型与接口定义:从 TypeScript 到鸿蒙的类型升级
javascript·华为·typescript·harmonyos·鸿蒙系统