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

307 阅读3分钟

前言

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

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

1. 准备

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

image.png

1.1 应用metadata中写入Client ID

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

image.png

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

image.png

1.2 加入调试证书

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

image.png

2. 开发

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

2.1 前端开发

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

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

2.1.1 基于Flutter开发的注意事项

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

用法就是 添加依赖:

dependencies:
    sign_in_with_huawei: ^0.0.3

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

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。

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

String response = obtainHuaweiAccessToken(authCode);
System.out.println(response);
JSONObject job = JSONObject.parseObject(response);
String accessToken = job.getString("access_token");

2.2.2 解析华为账号id

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

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。

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

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