ITPub博客

首页 > 移动开发 > ANDROID > 【接入指南】华为帐号服务Authorization Code模式介绍与接入步骤详解

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

原创 ANDROID 作者:华为开发者论坛 时间:2021-06-15 14:52:45 0 删除 编辑

华为帐号服务 提供两种登录授权模式,第一种是 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/huawei-account-demo/tree/master/Account-Server-Java-Demo

 

往期指南:

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

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

华为帐号服务相关链接:

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

>> codelab 接入指导

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

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


原文链接: https://developer.huawei.com/consumer/cn/forum/topic/0201550902897340204?fid=18

原作者:胡椒

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69970551/viewspace-2776749/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-04-21

  • 博文量
    402
  • 访问量
    726974