前言
随着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…
用法就是 添加依赖:
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. 总结
接入 华为账号登录 不难,但确实也有些坑,比如一定要是调试的证书,否则是不行。下一篇文章,我们将讲解如何接入华为应用内购买。