华为帐号服务提供两种登录授权模式,第一种是Authorization Code模式,第二种是ID-Token模式,这两种模式在使用场景上存在差异。本文将详细介绍Authorization Code模式及其接入方法,下一篇文章将给大家详解ID-Token模式。

Authorization Code模式介绍

使用场景:仅适用于开发者有自己的应用服务器场景。

优势:首次登录时,要求用户同意授权,当身份验证信息到期时,只需要从服务器端通过Refresh Token刷新Access Token令牌,不需要重复请求用户授权,体验更优。

业务流程:

Authorization Code模式接入步骤详解

1、 环境配置

推荐使用HMS Toolkit插件进行环境配置,更加方便、快捷。

2、 客户端开发:

(1)       展示华为帐号登录图标

华为帐号提供了一个按钮控件HuaweiIdAuthButton,此控件展示华为风格的登录按钮,可以让您方便快速地实现符合华为图标使用规范的登录按钮。

使用方法:在xml布局文件中添加如下声明,并通过不同可选参数调整风格。

<com.huawei.hms.support.hwid.ui.HuaweiIdAuthButtonandroid:id="@+id/HuaweiIdAuthButton"//自定义android:layout_width="wrap_content"android:layout_height="wrap_content"/>

(2)       编写帐号登录功能代码:

private void signInCode() {mAuthParam = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setAuthorizationCode().createParams();mAuthService = AccountAuthManager.getService(AuthWithAuthCodeActivity.this, mAuthParam);startActivityForResult(mAuthService.getSignInIntent(), REQUEST_SIGN_IN_LOGIN_CODE);
}

在需要的Activity(如AuthWithAuthCodeActivity)中编写如上signInCode()方法代码。代码中.setAuthorizatonCode()表示选择Authorization Code模式请求获取code。

之后在华为帐号登录按钮中绑定点击事件,触发按钮点击事件后执行signInCode()方法即可拉起基于Authorization Code模式的帐号登录授权页面。

(3)       登录授权后处理登录结果

 
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {// Process the sign-in authorization result and obtain an ID token from AuthHuaweiId.super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_SIGN_IN_LOGIN_CODE) {Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);if (authAccountTask.isSuccessful()) {// The sign-in is successful, and the user's HUAWEI ID information and Code are obtained.AuthAccount authAccount = authAccountTask.getResult();
            Log.i("AuthWithAuthCodeActivity", "Authorization code:" + authAccount.getAuthorizationCode());} else {// The sign-in failed.
            Log.e("AuthWithAuthCodeActivity", "sign in failed : " +((ApiException)authAccountTask.getException()).getStatusCode());}}
}

当登录授权成功后,通过authAccount.getAuthorizationCode()即可获取到code。

(4)       获取到code后,开发者需将code发送给应用服务器,该部分代码由开发者根据自身设计自行开发。

至此,登录授权功能的客户端代码开发完成。

3、 服务器侧开发:

(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。

请求示例:

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

响应参数:

参数名

描述

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+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"
}

响应参数说明:

参数

是否必选

参数类型

描述

client_id

Long

应用App ID。

expire_in

int

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

union_id

string

用户的union_id,由用户帐号和应用开发者帐号签名而成,需要应用ID包含com.huawei.android.hms.account.getUnionId权限时才会返回。对于同一个用户,同一个开发者帐号下管理的不同应用,UnionId值相同,它是开发者帐号的唯一标识

open_id

string

用户的union_id,由用户帐号和应用ID加密生成的,当Access Token为用户级,且入参open_id为OPENID时才返回。同一个用户,不同应用,OpenId值不同,它是用户的唯一标识

scope

string

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

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

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

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

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

(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"
}

响应参数说明:

参数

是否必选

参数类型

描述

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

用户邮箱。

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

至此,基于code模式的应用服务端关键开发步骤完成。

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

往期指南:

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

>>【接入指南】一个Demo带你玩转华为帐号服务

华为帐号服务相关链接:

>>华为帐号服务详细指导

>>codelab接入指导

>>视频讲解(请参考HMS 4.0视频讲解)

>>使用Toolkit快速集成华为帐号服务使用指导

原文链接:https://developer.huawei.com/...
原作者:胡椒

【接入指南】华为帐号服务Authorization Code模式介绍与接入步骤详解相关推荐

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

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

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

    笔者在<华为帐号服务学习笔记(二):OAuth2.0协议详解>中已经给大家介绍了Authorization Code模式是需要有后台服务器才能使用的,并且在<华为帐号服务学习笔记(三 ...

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

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

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

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

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

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

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

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

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

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

  8. Insights直播回顾| 华为帐号服务,打造全场景安全帐号体系

    了解更多相关内容>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub.Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~

  9. 华为帐号“一号畅玩”体验,助力游戏用户增长

    8月1日,华为HMS Core.Sparkle游戏应用创新沙龙在上海成功举办.在现场,嘉宾介绍了华为帐号服务(Account Kit)的功能和集成价值,吸引了不少开发者的兴趣. 华为帐号服务作为HMS ...

最新文章

  1. webpack从零开始第2课: 配置文件
  2. C与java通讯小结
  3. C#解析json文件的方法
  4. 一卡通vip充值消费线上oracle库服务器故障排查过程
  5. C#LeetCode刷题之#520-检测大写字母(Detect Capital)
  6. 拼接 结果集_JUST技术:利用轨迹拼接分析实时可达区域|技术前沿
  7. php 判断字符串为时间,检查字符串是否为unix时间戳
  8. 洛谷——P1025 数的划分
  9. 前段时间是Flash大战HTML5,现在是SliverLight“被遗弃”,我啊羡慕你们的热闹。...
  10. CentOS6/CentOS7系统配置IPv6地址的方法
  11. Axure中推动拉动元件不生效_mac系统axure元件不能拖动的非正常解决方法
  12. 常用服务器管理口IP及账号密码(持续更新)
  13. txt电子书如何用安卓手机完美打开?
  14. 网站标题设计与搜索引擎
  15. UCASE() 函数
  16. 北理工计算机组成原理在线作业,[北京师范大学]20秋《计算机组成原理》离线作业...
  17. 使用markdownpad生成目录
  18. Java webp图片处理
  19. Moblin授权中心在台北挂牌开业
  20. 现代信号处理——时频分析与时频分布(时频分布的基本理论)

热门文章

  1. python3爬虫实战(一)爬取创业邦创投库
  2. 2021年全球团状模塑料(BMC)收入大约657.1百万美元,预计2028年达到827.5百万美元
  3. 新库上线 | CnOpenData·IFR工业机器人数据
  4. 在c语言程序中,数组名做函数调用的实参时,传递给形参的是,若用数组名作为函数调用时的实参,则实际上传递给的形参的是(C)...
  5. 【Alpha阶段】第二次Scrum Meeting
  6. JavaScript赋值运算符,比较运算符,逻辑运算符
  7. php中{ifp}{ife}{ifpp}是什么意思、作用
  8. 需求与商业模式创新-需求8-面谈
  9. 适合短期内想快速上手数字孪生系统的人使用的数字孪生软件推荐
  10. 2020牛客暑期多校训练营(第八场) Enigmatic Partition