写点什么

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

用户头像
Coding狙击
关注
发布于: 2021 年 04 月 17 日

笔者在《华为帐号服务学习笔记(二):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 分钟,且用一次就会失效,失效后需要通知客户端重新获取用户授权。

请求参数:



请求示例:

POST /oauth2/v3/token

HTTP/1.1Host: oauth-login.cloud.huawei.com

Content-Type: application/x-www-formurlencoded

grant_type=authorization_code&

code=CF3L7XyCVZi52XMdsUzD7Z6ap0/N2qExcNe0AMqTselTtNd1B4DUwTsQ/23FPZasC8yI29v+N2s2jMT/T2MXiuc+178I/sYuWVoTyqwBaDqVW82KCMqaxbeWBguH4hEENxmDSUIE61Qg5R1F074PiS+qJYnbLI2IBqatS37px8pn5qnuq5oX+UX8XN3/w8HLt4GpakW5Dk1v7hGs&

client_id={app_id}&

client_secret={app_secret}&

redirect_uri=https://www.example.com/redirect_uri


响应参数:



响应示例:

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

Cache-Control: no-storePragma: no-cache

{

"access_token": "CFyJ21sNODl16eV9y2vu3CwQk9DBr32BkOcxxgAd7MZUR5th1giyTk5/kA+QDAyxou+/5U2zzBRcf3qgLkkFdtbbC+mM3zFV7xj7CCEMHc5Tw92al0Y=",

"refresh_token": "CF13G0sRaGybtYt7SIyeUILNORtTFwMgz4ao5C7j7vtgLPt6ogmXKjdI8RS/YlyS71z4DyP6kEMnOrRlmNK0KhdOUNWd+qVLLRsEEHkqRIKpuAkPvL8=",

"expires_in": 3600,

"id_token": "eyJraWQiOiI3YTNlYjRkNTJmMDdhODM0NDU4MmRhOGQ3MWE1MGQ5MDlmNWM0YmRiZTFkNDQ3MjQ2MDNhZTA2NGM0ZTlkZGYyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiM0hPdFZYOEdMcG1GSDBWRVlSc1BjdyIsImF1ZCI6IjEwMDczNTE2NyIsInN1YiI6Ik1ERTlYaWFoc3MwaWFFNXU2c09PaEY5Mlhvell0Rkt4bUdtbWlhNGtTaEJ3dklLR2ciLCJhenAiOiIxMDA3MzUxNjciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmh1YXdlaS5jb20",

"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%2FHeHDBldhW3tYizcw3xXSVwJPWK82C8zPM%3D

其中 open_id 为固定值“OPENID”。


响应示例:

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

{

"union_id": "MDHSI1UnQ9wzGzibtoqicNNnUmJbwhicPzHxxiaVHvMtmNd3xw",

"scope": "https://www.huawei.com/auth/account",

"open_id": "MDFAMzAwMDE3NTAxQGI4ODgzNWRmYjE4ZTI2NGFiaZDE2YjI5ODMwMDM3MDA0QDIxYWY3NzVkZmM1ODk1MWY4NzI4YzFiaNGJkMjE2Y2QyZTUxNzg3NzUzMDcyZTM4ZjkyZTQxYw",

"expire_in": 1123,

"client_id": "300017501"

}

响应参数说明:



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=CF2Mm03n0aos9iZZ8nIhfyDtoXy74CXeBi50gVVhMpB0IUzlv9ZwizEvTBhVoF820ZPim0JwNR9j2p1qgEQWnIVYZRlp4T6ezMgekUnsHBkvNev5rd2MdfQMLP


响应示例:

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+vQXz3PWsivkKCuL78XtbLt7vs=",

"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjExOGRmMjU0YjgzNzE4OWQxYmMyYmU5NjUwYTgyMTEyYzAwZGY1YTQiLCJ0eXAiOiJKV1QifQ.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%2BFdM3LEja3z7%2BjOGu27mNBsKwBznSoe4MMfKmNw4aGNLisoCKYgbSOJIVhWLOIIVr0nMwVXFu9AvFGKoJmGk%2FUZdMDytv2bsamauePs3FG6ZkU%3D&getNickName=0


响应示例:

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

{

"displayName":"182******74",

"openID":"MDFAMTAxMDA1MTg1QGFlMzM0OWIyOGY0MzNiaNjI1MDRiaNTI5ODAxYTA3MDhkQDU1MDA4ZTZmNTA2ZTE4ZTg0Yzc2YTlmNGVmN2E1ZjY1OTg4NWRiaN2QxMzQyMDUzNGMzNTU0YWQ3",

"headPictureURL":"https://upfile-drcn.platform.hicloud.com/FileServer/image/b.0150086000130905592.20180407082531.08157939582468778294625163020035.1000.9C3EE92B95EFEF4CAC263604A15953F32C7BC9E8A47D52B774511F75EF34C0D4.jpg"

}

响应参数说明:



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


服务端相关示例代码可参考https://github.com/HMS-Core/huawei-account-demo/tree/master/Account-Server-Java-Demo


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

用户头像

Coding狙击

关注

还未添加个人签名 2018.11.01 加入

还未添加个人简介

评论

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