华为帐号服务提供两种登录受权模式,第一种是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.HuaweiIdAuthButton android: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分钟,且用一次就会生效,生效后须要告诉客户端从新获取用户受权。
申请参数:
申请示例:
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过期错误码来判断;
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" }
响应参数阐明:
注:当利用有获取头像、手机号、服务地国家、注册地、生日、年龄段、邮箱权限后才返回对应信息,获取权限请参见帐号凋谢信息获取流程。
至此,基于code模式的利用服务端要害开发步骤实现。
服务端相干示例代码可参考https://github.com/HMS-Core/h…
往期指南:
【接入指南】一文带你理解华为帐号服务
【接入指南】一个Demo带你玩转华为帐号服务
华为帐号服务相干链接:
华为帐号服务具体领导
codelab接入领导
视频解说(请参考HMS 4.0视频解说)
应用Toolkit疾速集成华为帐号服务应用领导
原文链接:https://developer.huawei.com/…
原作者:胡椒