华为HMS生态与应用开发实战
上QQ阅读APP看书,第一时间看更新

2.3.3 Service Account使用

(1)Service Account获取

Service Account是用于开发者服务器与HMS Core开放能力服务器间对接的凭证,开发者可直接在华为开发者联盟的API Console上创建生成Service Account,并根据下载的JSON文件生成服务账号凭证。Service Account获取界面如图2-15所示。

服务账号凭证是一个JWT(JSON Web Token)格式字符串,JWT数据格式包括3个部分:Header(头部)、Payload(负载)和Signature(签名)。这3个部分通过“.”进行连接,其中Signature为通过SHA256withRSA算法对Header与Payload拼接的字符串进行签名而生成的字符串。更多JWT的相关知识请参考https://jwt.io/introduction/

我们先介绍如何生成JWT头部数据,从表2-1可以了解头部数据的格式。

图2-15 Service Account获取

表2-1 JWT头部数据格式

头部的JSON示例为:


{
"kid":"c60c27b8f2f34e9bac2b07c852f1800e",
"typ":"JWT",
"alg":"RS256"
}

进行Base64编码后的头部如下所示:


eyJraWQiOiJjNjBjMjdiOGYyZjM0ZTliYWMyYjA3Yzg1MmYxODAwZSIsInR5cCI6IkpXVCIsImFsZy
    I6IlJTMjU2In0

再来看看如何生成JWT负载数据。负载组中的字段如表2-2所示。

表2-2 JWT负载组字段

负载的JSON示例:


{
"aud": "https://oauth-login.cloud.huawei.com/oauth2/v3/token",
  "iss": "300125961",
"exp": 1581410664,
"iat": 1581407064
}

进行Base64编码后的负载如下所示:


eyJhdWQiOiJodHRwczovL29hdXRoLWxvZ2luLmNsb3VkLmh1YXdlaS5jb20vb2F1dGgyL3YzL3Rva2
    VuIiwiaXNzIjoiMzAwMTI1OTYxIiwiZXhwIjoxNTgxNDEwNjY0LCJpYXQiOjE1ODE0MDcwNjR9

最后了解如何生成JWT签名数据。将完成Base64编码后的Header字符串与Payload字符串通过“.”进行连接。开发者可在业务应用中让JSON文件中的private_key[1]使用SHA256withRSA算法对拼接的字符串签名,具体如下所示。


JWT签名数据=SHA256withRSA (base64UrlEncode(header) + "." +base64UrlEncode(payload), 
    private_key);

(2)使用示例

将生成的JWT放在HTTP请求头部的Authorization中,格式如下:


Authorization: Bearer JWT

注意,Bearer与JWT之间需要有一个空格。

消息示例如下:


GET /v1/demo/indexes HTTP/1.1
Authorization:Bearer eyJraWQiOiIx---xxx.eyJhdWQiOiJodHR---xxx.QRodgXa2xeXSt4Gp
    ---xxx
Host: oauth-api.cloud.huawei.com

(3)典型交互流程

开发者App通过Service Account来访问应用的接口,如图2-16所示。

具体交互流程如下。

①开发者构造JWT;

图2-16 Service Account交互流程

②开发者App携带JWT访问华为OAuth服务器;

③华为OAuth服务器验证JWT的有效性;

④华为OAuth服务器返回Access Token;

⑤开发者App携带Access Token访问相关的资源。

⑥华为业务服务器的接口返回需要的数据。

[1] 华为不进行存储,请开发者妥善保管。