关于java:华为帐号服务学习笔记四Authorization-Code模式服务端开发

158次阅读

共计 5814 个字符,预计需要花费 15 分钟才能阅读完成。

笔者在《华为帐号服务学习笔记(二):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/redir…

响应参数:

响应示例:
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”:”18274″,
“openID”:”MDFAMTAxMDA1MTg1QGFlMzM0OWIyOGY0MzNiaNjI1MDRiaNTI5ODAxYTA3MDhkQDU1MDA4ZTZmNTA2ZTE4ZTg0Yzc2YTlmNGVmN2E1ZjY1OTg4NWRiaN2QxMzQyMDUzNGMzNTU0YWQ3″,
“headPictureURL”:”https://upfile-drcn.platform.hicloud.com/FileServer/image/b.0150086000130905592.20180407082531.08157939582468778294625163020035.1000.9C3EE92B95EFEF4CAC263604A15953F32C7BC9E8A47D52B774511F75EF34C0D4.jpg”
}
响应参数阐明:

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

服务端相干示例代码可参考 https://github.com/HMS-Core/h…
后续笔者会一直输入相干畛域的优质内容,心愿大家继续关注本帐号!

正文完
 0