笔者在《华为帐号服务学习笔记(二):OAuth2.0 协定详解》中曾经给大家介绍了 Authorization Code 模式是须要有后盾服务器能力应用的,并且在《华为帐号服务学习笔记(三):10 分钟实现 Authorization Code 模式客户端 Demo 开发》文章中曾经给大家介绍了一种高效实现客户端 Demo 开发的形式,本篇文章将介绍 code 模式服务端须要的开发步骤及注意事项,在介绍之前,笔者再带大家先回顾下 Code 模式整体的交互流程是怎么的,华为帐号服务在应用 code 模式时流程有哪些差别。
华为帐号服务 Authorization Code 模式业务流程
步骤具体介绍:
- 用户抉择帐号登录形式登录利用客户端。
- 利用客户端向帐号 SDK 发送申请,获取 Authorization Code。
- 帐号 SDK 向 HMS Core(APK)发送申请,获取 Authorization Code。
- HMS Core(APK)向帐号服务器发送申请,获取 Authorization Code。
- HMS Core(APK)展现帐号服务器的用户登录受权界面,界面上会依据登录申请中携带的受权域(scopes)信息,显式告知用户须要受权的内容。
- 用户容许受权。
- 帐号服务器返回 Authorization Code 信息给 HMS Core(APK)。
- HMS Core(APK)返回 Authorization Code 信息给帐号 SDK。
- 帐号 SDK 返回 Authorization Code 信息给利用客户端。
- 利用客户端将获取到的 Authorization Code 信息发给应用服务器。
- 应用服务器向帐号服务器发送申请,获取 Access Token、Refresh Token、ID Token 信息。
- 帐号服务器返回 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…
后续笔者会一直输入相干畛域的优质内容,心愿大家继续关注本帐号!