ITPub博客

首页 > 应用开发 > Java > 华为帐号服务学习笔记(四):Authorization Code模式服务端开发

华为帐号服务学习笔记(四):Authorization Code模式服务端开发

原创 Java 作者:凌霄科技 时间:2021-04-17 15:10:49 0 删除 编辑

笔者在《华为帐号服务学习笔记(二):OAuth2.0 协议详解》中已经给大家介绍了Authorization Code 模式是需要有后台服务器才能使用的,并且在《华为帐号服务学习笔记(三):10 分钟完成Authorization Code 模式客户端Demo 开发》文章中已经给大家介绍了一种高效完成客户端Demo 开发的方式,本篇文章将介绍code 模式服务端需要的开发步骤及注意事项,在介绍之前,笔者再带大家先回顾下Code 模式整体的交互流程是怎样的,华为帐号服务在使用code 模式时流程有哪些差异。

 

华为帐号服务Authorization Code 模式业务流程

 

步骤详细介绍:

1.          用户选择帐号登录方式登录应用客户端。

2.          应用客户端向帐号SDK 发送请求,获取Authorization Code 。

3.          帐号SDK 向HMS Core (APK )发送请求,获取Authorization Code 。

4.          HMS Core (APK )向帐号服务器发送请求,获取Authorization Code 。

5.          HMS Core (APK )展示帐号服务器的用户登录授权界面,界面上会根据登录请求中携带的授权域(scopes )信息, 显式告知用户需要授权的内容。

6.          用户允许授权。

7.          帐号服务器返回Authorization Code 信息给HMS Core (APK )。

8.          HMS Core (APK )返回Authorization Code 信息给帐号SDK 。

9.          帐号SDK 返回Authorization Code 信息给应用客户端。

10.      应用客户端将获取到的Authorization Code 信息发给应用服务器。

11.      应用服务器向帐号服务器发送请求,获取Access Token 、Refresh Token 、ID Token 信息。

12.      帐号服务器返回Access Token 、Refresh Token 、ID Token 信息。

 

从流程中可以看到,里面涉及的华为帐号SDK 和HMS Core APK ,当前HMS Core apk 在所有华为新发布的手机中已经预装了,如果没有装的话,在登录华为帐号的时候也会提示用户安装,这是在华为手机等移动端上的流程,后续在非华为手机、及其他移动端设备上华为也会有相对应的出端方案,这部分让我们拭目以待。

 

Authorization Code 模式服务端开发步骤与接口示例

 

1 、接收来自客户端发送的code

该部分代码涉及到客户端和服务端的交互方式,需要根据自身设计开发,华为没有提供示例代码。

 

2 、用code 换Access Token

应用服务器调用华为帐号服务器对应接口将code 换成Access Token 、Refresh Token 。同时将Access Token 、Refresh Token 保存在应用服务器。

注:code 有效期只有5 分钟,且用一次就会失效,失效后需要通知客户端重新获取用户授权。

请求参数:

参数名

描述

grant_type

OAuth 2.0 规范定义的字段,该值固定填 “authorization_code” 。

code

客户端发送的授权码

client_id

App ID ,在创建应用后由华为开发者联盟为应用分配的唯一标识。

client_secret

App SECRET ,在创建应用后由华为开发者联盟为应用分配公钥。

redirect_uri

AppGallery Connect 中设置应用服务器的回调地址,用于应用服务器在获取用户授权后获取凭证 Access Token 。

如果只是调试的话,可以使用默认的 url :hms://redirect_uri,不需要在AGC上设置

请求示例:

POST /oauth2/v3/token HTTP/
1.1

Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=CF3L7XyCVZi52XMdsUzD7Z6ap0/N2qExcNe0AMqTselTtNd1B4DUwTsQ/
23F PZasC8yI29v+N2s2jMT/T2MXiuc+ 178 I/sYuWVoTyqwBaDqVW82KCMqax
beWBguH4hEENxmDSUIE61Qg5R1F074PiS+qJYnbLI2IBqatS37px8pn5qnuq5oX+UX8XN3/w8HLt4GpakW5Dk1v7hGs&
client_id={app_id}&
client_secret={app_secret}&
redirect_uri=

响应参数:

参数名

描述

access_token

用户的Access Token。

refresh_token

如果应用申请帐号服务时,入参中包含access_type=offline,则会返回此参数,该参数用于刷新Access Token。

expires_in

Access Token 的过期时间,以秒为单位。默认60分钟过期。

id_token

如果应用申请帐号服务时,入参scope中包含openid,则会返回此参数(JWT格式数据),包含用户基本帐号、用户邮箱等信息。ID Token的描述信息请参见ID Token验证接口中ID Token描述。

scope

生成的凭证Access Token中包含的scope。

token_type

固定返回Bearer,标识返回Access Token的类型。

响应示例:

HTTP/
1.1 200 
OK

Content-Type: application/json
; charset=UTF- 8
Cache-Control: no-store
Pragma: no-cache
{
"access_token" : "CFyJ21sNODl16eV9y2vu3CwQk9DBr32BkOcxxgAd7MZUR5th1giyTk5\/kA+QDAyxou+\/5U2zzBRcf3qgLkkFdtbbC+mM3zFV7xj7CC
EMHc5Tw92al0Y="
,
"refresh_token" : "CF13G0sRaGybtYt7SIyeUILNORtTFwMgz4ao5C7j7vtgLPt6ogmXKjdI8RS\/YlyS71z4DyP6kEMnOrRlmNK0KhdOUNWd+qVLLRsEEHk
qRIKpuAkPvL8="
,
"expires_in" : 3600 ,
"id_token" : "eyJraWQiOiI3YTNlYjRkNTJmMDdhODM0NDU4MmRhOGQ3MWE1MGQ5MDlmNWM0YmRiZTFkNDQ3MjQ2MDNhZTA2NGM0ZTlkZGYyIiwidHlwIjoi
SldUIiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiM0hPdFZYOEdMcG1GSDBWRVlSc1BjdyIsImF1ZCI6IjEwMDczNTE2NyIsInN1YiI6Ik1ERTlYaWFoc3Mw
aWFFNXU2c09PaEY5Mlhvell0Rkt4bUdtbWlhNGtTaEJ3dklLR2ciLCJhenAiOiIxMDA3MzUxNjciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmh1YXdlaS5jb2
0"
,
"scope" : "openid profile email" ,
"token_type" : "Bearer"
}

 

3 、解析Access Token

获取到Access Token ,要对其进行解析鉴权,获取Access Token 中包含的union_id 、open_id 、expire_in 、scope 等信息。

请求示例:

POST /rest.php?nsp_fmt=JSON&nsp_svc=huawei.oauth2.user.getTokenInfo HTTP/
1.1

Host: oauth-api.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
open_id=OPENID&
access_token=CFwaKaGpgXEj9LlsDKVARTUL7DFkvbAE2a22HYpRx%2F520JO5UvfWqSc6X7XUwf4Pzo5%2FxC8mByagdMPG%2FHeHDBldhW3tYizcw3
xXSVwJPWK82C8zPM%3D


其中 open_id 为固定值“OPENID”。

响应示例:

HTTP/
1.1 200 
OK

Content-Type: application/json
; charset=UTF- 8
{
"union_id" : "MDHSI1UnQ9wzGzibtoqicNNnUmJbwhicPzHxxiaVHvMtmNd3xw" ,
"scope" : " ,
"open_id" : "MDFAMzAwMDE3NTAxQGI4ODgzNWRmYjE4ZTI2NGFiaZDE2YjI5ODMwMDM3MDA0QDIxYWY3NzVkZmM1ODk1MWY4NzI4YzFiaNGJkMj
           E2Y2QyZTUxNzg3NzUzMDcyZTM4ZjkyZTQxYw"
,
"expire_in" : 1123 ,
"client_id" : "300017501"
}

响应参数说明:

参数

是否必选

参数类型

描述

client_id

是

Long

应用 App ID 。

expire_in

是

int

Access Token 的过期时间,单位为秒。默认为 60 分钟。

union_id

否

string

用户的 union_id ,由用户帐号和应用开发者帐号签名而成,需要应用 ID 包含 com.huawei.android.hms.account.getUnionId 权限时才会返回。

open_id

否

string

用户的 open_id ,由用户帐号和应用 ID 加密生成的,当 Access Token 为用户级,且入参 open_id 为 OPENID 时才返回。

scope

否

string

用户授权 scope 列表,当 Access Token 为用户级时才返回。

 

4 、 判断 Access Token 、Refresh Token 是否过期

A、 解析AT 后,可获取该AT 的有效期时间(默认60 分钟),开发者可以根据这个时间进行倒计时判断当前AT 是否即将过期,做好提前保活,这部分代码需要我们自行开发;

B、 另一种方式是看用AT 去获取用户信息的时候是否返回AT 过期错误码( NSP_STATUS=6 )来判断;

C、 RT 是否过期(默认有效期180 天)可以通过用RT 换取AT 时是否返回RT 过期错误码(主错误码: 1203 ,子错误码:11205)来判断。

 

5、 Access Token 即将过期或已过期,可用Refresh Token 去华为帐号服务器刷新 Access Token

当Access Token 未过期,用Refresh Token 去刷新不会改变Access Token ,但超时时间会刷新。

当Access Token 已过期,用Refresh Token 去刷新,会获得一个新的Access Token 。

RT 刷新AT 的接口与用Code 换取AT 的接口类似,只需要将grant_type 换成”refresh_token” 、code 换成Refresh Token ,同时去掉 redirect_uri 参数即可。

请求示例:

POST /oauth2/v3/token HTTP/1.1

Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
client_id=12345&
client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few&
refresh_token=CF2Mm03n0aos9iZZ8nIhfyDtoXy74CXeBi50gVVhMpB0IUzlv9ZwizEvTBhVoF820ZPim0JwNR9j2p1qgEQWnIVYZRlp4T6ez
MgekUnsHBkvNev5rd2MdfQMLP

响应示例:

HTTP/
1.1 200 
OK

Content-Type: application/json
; charset=UTF- 8
Cache-Control: no-store
Pragma: no-cache
{
"access_token" : "CFyJ4J\/l6wuwcFqYOJG4maq2ca8RAV+g0i+mel6qCV5lvqH0PYtW0+BNwfHWg0AqMnW6ZdBvUgs7ijkxMFh1xVP\/B+vQXz3PWsivkK
CuL78XtbLt7vs="
,
"id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjExOGRmMjU0YjgzNzE4OWQxYmMyYmU5NjUwYTgyMTEyYzAwZGY1YTQiLCJ0eXAiOiJKV1Qif
Q.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiI3ODI0NTY2Njc4OTgtc2M0MzE3Y2l0NGEwMjB0NzdrbGdsbWo1ZjA4YWtnMWIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODI0NTY2Njc4OTgtN2NkNGJpYWRkaGVwNGc4cnZic2VlOGtwcDA5Zm1hNzIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDE3MTIxMzkwMzgwNDE2MDc0MTQiLCJlbWFpbCI6Inh1ZXpoZW5odWF0anVAc2l"
,
"expires_in" : 3600 ,
"scope" : "openid profile email" ,
"token_type" : "Bearer"
}

 

6 、Refresh Token 过期后,应用服务器需通知客户端重新申请用户授权,重新获取code ,刷新AT 和RT

该部分代码需要我们开发者根据自身设计去开发,华为没有提供示例代码。

注:这个步骤很容易遗漏

 

7 、使用Access Token 去华为帐号服务器获取用户信息

应用已经获取到Access Token 并已申请帐号开放信息对应权限后,应用需要获取帐号用户名称、头像、手机号码、年龄等信息。

请求示例:

POST /rest.php?nsp_svc=GOpen.User.getInfo HTTP/
1.1

Host: account.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
access_token=CV46i%
2 BFdM3LEja3z7% 2 BjOGu27mNBsKwBznSoe4MMfKmNw4aGNLisoCKYgbSOJIVhWLOIIVr0nMwVXFu9AvFGKoJmGk% 2F UZdMDytv2bs
amauePs3FG6ZkU%
3D &
getNickName=0

响应示例:

HTTP/
1.1 200 
OK

Content-Type: application/json
; charset=UTF- 8
{
"displayName" : "182******74" ,
"openID" : "MDFAMTAxMDA1MTg1QGFlMzM0OWIyOGY0MzNiaNjI1MDRiaNTI5ODAxYTA3MDhkQDU1MDA4ZTZmNTA2ZTE4ZTg0Yzc2YTlmNGVmN2E1ZjY1OTg4N
WRiaN2QxMzQyMDUzNGMzNTU0YWQ3"
,
"headPictureURL" : "https://upfile-drcn.platform.hicloud.com/FileServer/image/b.0150086000130905592.20180407082531.0815793
9582468778294625163020035.1000.9C3EE92B95EFEF4CAC263604A15953F32C7BC9E8A47D52B774511F75EF34C0D4.jpg"
}

响应参数说明:

参数

是否必选

参数类型

描述

openID

是

string

用户openID。

displayName

是

string

getNickName 为0或不传时,按照匿名化帐号、昵称的先后顺序返回。

getNickName 为1时,按照昵称、匿名化帐号的先后顺序返回。

headPictureURL

否

string

用户头像。

mobileNumber

否

string

用户手机号。

srvNationalCode

否

string

用户服务地国家。

nationalCode

否

string

用户注册地。

birthDate

否

string

生日。

ageGroupFlag

否

Int

年龄段。

-1 :年龄未知(没输入生日)   。

0 :成人。

1 :未成人,介于儿童和成人之间。

2 :儿童。

email

否

string

用户邮箱。

注:当应用有获取头像、手机号、服务地国家、注册地、生日、年龄段、邮箱权限后才返回对应信息。

 

服务端相关示例代码可参考


**后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!**


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69997171/viewspace-2768524/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-03-25

  • 博文量
    6
  • 访问量
    2843