笔者在《华为帐号服务学习笔记(二):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.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
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-store
Pragma: 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

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

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

  1. Java微服务学习笔记(一):微服务架构的概念理解

    Java微服务学习笔记 Tips:入门学习时粗略整理,仅供参考 (一):架构的基础理解 文章目录 Java微服务学习笔记 前言 一.微服务是什么? 二.常用开源微服务框架演化 1. Dubbo 2. ...

  2. 【接入指南】华为帐号服务Authorization Code模式介绍与接入步骤详解

    华为帐号服务提供两种登录授权模式,第一种是Authorization Code模式,第二种是ID-Token模式,这两种模式在使用场景上存在差异.本文将详细介绍Authorization Code模式 ...

  3. 快速上手!华为帐号服务Authorization Code模式接入详解

    华为帐号服务提供两种登录授权模式,第一种是Authorization Code模式,第二种是ID-Token模式,这两种模式在使用场景上存在差异.本文将详细介绍Authorization Code模式 ...

  4. 【Insights直播】华为帐号服务,打造全场景安全帐号体系

    在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...

  5. 华为帐号服务升级,助力应用快速验证用户身份

    目前,在电商.金融.社交等多种行业的APP中,"帐号+短信验证码"已成为验证用户身份的主流方式.短信验证具有易操作.安全性高.成本低的优势,在用户注册.登录.绑定手机号等许多场景中 ...

  6. 华为帐号服务助力应用运营和用户转化

    6月10日,华为HMS Core Sparkle创新沙龙在北京成功举办.本次沙龙以"打造精品应用 共创数智生活"为主题,与广大社交.出行.新闻资讯等领域的开发者朋友见面,探讨了各领 ...

  7. 【接入指南】一文带你了解华为帐号服务

    什么是华为帐号服务 华为帐号是用户访问华为生态应用的凭证,拥有帐号的用户,可以畅享华为终端云服务应用等在内的众多华为服务.作为HMS Core基础开发服务能力之一,华为帐号服务为开发者提供了简单.安全 ...

  8. 华为帐号服务升级,提供通用短信验证码读取能力

    目前,在电商.金融.社交等多种行业的APP中,"帐号+短信验证码"这种验证方式已成为验证用户身份的主流.短信验证具有易操作.安全性高.成本低的优势,在用户注册.登录.绑定手机号等许 ...

  9. 【华为游戏服务】同一游戏同一个手机号的华为帐号登录返回的playerId不同

    问题描述 我们华为渠道的一款游戏,接到现网某玩家反馈:手机和平板上登录同一个华为帐号,但是两边的游戏数据不同步.经过我们分析,发现该用户使用的是同一个手机号的华为帐号,登录游戏时华为游戏SDK的get ...

最新文章

  1. 初始 DQN 程序 所遇到的问题
  2. apply call this arguments caller callee
  3. 高一数学集合知识点整理_高一数学 | 高一数学函数图像知识点总结,实用!
  4. python实现文件传输_Python使用socket实现简单的文件传输并校验
  5. container and Injection
  6. java 同步块(Java Synchronized Blocks)
  7. windows DNS服务器的配置
  8. 华为 linux文件系统,华为EROFS文件系统是什么
  9. clion ros debug clion配置ros环境及调试
  10. visual studio 提高速度的选项
  11. Android HTTP边下边播
  12. 阿里云云平台,物联网可视化web界面简单教程
  13. 格拉姆--施密特(Gram-Schmidt)正交化方法笔记
  14. 压缩为王-阿里第五届中间件复赛总结
  15. idea启动报符号缺失,无法启动与构建
  16. STM32MP157驱动开发——Linux 音频驱动
  17. 爆改YOLOV7的detect.py制作成API接口供其他python程序调用(超低延时)
  18. matlab实验报告四,matlab实验报告4
  19. SQL简单基础(2)
  20. 深度之眼 - Python学习笔记——第八章 文件、异常和模块

热门文章

  1. 美国中情局投资量子公司Q-CTRL
  2. gprs 神奇宝典java,联通GPRS加速转型绽放异彩
  3. Number、Number()和new Number()
  4. 弧形玻璃清洁机器人_一种用于弧形楼梯的清洁机器人的制作方法
  5. carplay逆向第四步操作:上层APP,通过NCM,实现相关网络协议
  6. 新型肺炎疫情自行隔离期间我们可以干的正事
  7. win10+安装Python 3.9.0b4+anaconda3
  8. 【新提醒】夏新大v安卓4.1尝鲜最新更新版本发布(包含进步版)1124更新 - 大V综合交流区 360论坛...
  9. 青岛职业技术学院计算机专业录取分数线,2017年青岛市中职技校录取分数线公布...
  10. 9.WireShark学习-使用WireShark分析SYN-Flooding攻击