简介

HMS 华为帐号注册用户量已达到5亿,通过华为帐号可以一键登录应用,通过与华为帐号绑定,可以为应用快速引入新用户和登录。华为帐号开放遵循OAuth2.0以及OpenID Connect标准规范。
开发者需要,

您将建立什么

在这个Codelab中,你将使用已经创建好的Demo Project实现对华为帐号开放服务的API调用,通过Demo Project你可以体验到:

您将会学到什么

硬件要求

软件要求

集成HUAWEI HMS能力,需要完成以下准备工作

具体操作,请按照《HMS Core 3.0集成准备》中详细说明来完成。

  1. AppGallery Connect的应用页面中点击"开发"页签,点击"概览"后的图标,选择"API管理"。
  2. 打开"Huawei ID"服务开关。

至此,已经为创建的应用开通了"帐号"服务。

获取配置文件

将创建应用章节下载的"agconnect-services.json"文件移至AndroidStudio开发工程应用模块的根目录

配置HMS SDK的maven仓

  1. 打开AndroidStudio项目级build.gradle文件。
  2. 在allprojects ->repositories和buildscript->repositories里面配置HMS SDK的maven仓地址。
    repositories { maven {url 'http://developer.huawei.com/repo/'} }
  3. 在buildscript ->dependencies里面增加配置。
    buildscript { dependencies { classpath 'com.huawei.agconnect:agcp:1.0.0.300' }
  4. 打开应用级的build.gradle文件。
  5. 在"dependencies"中添加如下编译依赖,其中{version}替换为HMS SDK的版本号,当前为3.0.0.300。
    dependencies { implementation 'com.huawei.hms:hwid:{version}' }
  6. 在文件头添加配置
    apply plugin: 'com.huawei.agconnect'
  7. 点击sync now 同步工程

配置签名

将签名文件拷贝到工程的app目录下。同时在应用级build.gradle文件中配置签名。

配置混淆脚本

  1. 打开AndroidStudio工程的混淆配置文件proguard-rules.pro。
  2. 加入混淆配置。
    -ignorewarning -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;}

帐号的交互接口主要涉及登录、静默登录、退出帐号、取消授权。本次Codelab中您可以在您的AndroidStudio工程中创建一个布局页面,参照下图进行UI设计。

ID Token模式登录华为帐号

ID Token模式整体流程:

  1. 用户点击华为帐号授权登录图标,请求使用华为帐号授权登录;
  2. 华为帐号拉起用户登录授权界面,界面上会根据登录请求中携带的授权域(scope)信息, 显式告知用户需要授权的内容。
  3. 用户手动允许授权后,华为帐号返回ID Token信息。
  4. 应用选择使用本地方式验证或华为帐号服务器方式验证ID Token。

ID Token模式代码示例:

  1. 展示华为登录方式图标。

应用在登录页面展示华为帐号登录方式的图标,华为登录方式图标规范可参考华为图标规范

  1. 调用HuaweiIdSignInOptions.Builder的requestIdToken方法请求授权。
    HuaweiIdSignInOptions mSignInOptions; mSignInOptions = new HuaweiIdSignInOptions.Builder(HuaweiIdSignInOptions.DEFAULT_SIGN_IN).requestIdToken("").build();
  2. 调用HuaweiIdSignIn的getClient方法初始化HuaweiIdSignInClient对象。
    HuaweiIdSignInClient mSignInClient = HuaweiIdSignIn.getClient(HuaweiIdActivity.this, mSignInOptions);
  3. 调用HuaweiIdSignInClient的getSignInIntent方法并拉起华为帐号登录授权页面。
    startActivityForResult(mSignInClient.getSignInIntent(), Constant.REQUEST_SIGN_IN_LOGIN);
  4. 登录授权完成后处理登录结果。
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constant.REQUEST_SIGN_IN_LOGIN) { //login success //get user message by getSignedInAccountFromIntent Task<SignInHuaweiId> signInHuaweiIdTask = HuaweiIdSignIn.getSignedInAccountFromIntent(data); if (signInHuaweiIdTask.isSuccessful()) { SignInHuaweiId huaweiAccount = signInHuaweiIdTask.getResult(); Log.i(TAG, "signIn success " + huaweiAccount.getDisplayName()); } else { Log.i(TAG, "signIn failed: " + ((ApiException) signInHuaweiIdTask.getException()).getStatusCode()); } } }

Authorization Code模式登录华为帐号

华为帐号还支持使用Authorization Code授权登录. 适用于拥有server端的应用授权.

Authorization Code整体流程:

  1. 用户点击华为帐号授权登录图标,请求使用华为帐号授权登录;
  2. 华为帐号拉起用户授权界面,界面上会根据登录请求中携带的授权域(scope)信息, 显式告知用户需要授权的内容;
  3. 用户手动允许授权后,华为帐号返回authorization code信息;
  4. 第三方应用获取authorization code后通过服务端接口换取access_token,refresh_token,id_token信息;
  5. id_token过期后,使用refresh_token获取新的access_token,id_token信息。

Authorization Code模式代码示例:

  1. 展示华为登录方式图标。

应用在登录页面展示华为帐号登录方式的图标,华为登录方式图标规范可参考华为图标规范

  1. 调用HuaweiIdSignInOptions.Builder的requestServerAuthCode方法请求授权。
    HuaweiIdSignInOptions signInOptions = new HuaweiIdSignInOptions.Builder(HuaweiIdSignInOptions.DEFAULT_SIGN_IN).requestServerAuthCode().build();
  2. 调用HuaweiIdSignIn的getClient方法初始化HuaweiIdSignInClient对象。
    HuaweiIdSignInClient client = HuaweiIdSignIn.getClient(MainActivity.this, signInOptions);
  3. 调用HuaweiIdSignInClient的getSignInIntent方法并拉起华为帐号登录授权页面。
    startActivityForResult(mSignInClient.getSignInIntent(), Constant.REQUEST_SIGN_IN_LOGIN_CODE);
  4. 登录授权完成后处理登录结果。
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constant.REQUEST_SIGN_IN_LOGIN_CODE) { //login success Task<SignInHuaweiId> signInHuaweiIdTask = HuaweiIdSignIn.getSignedInAccountFromIntent(data); if (signInHuaweiIdTask.isSuccessful()) { SignInHuaweiId huaweiAccount = signInHuaweiIdTask.getResult(); Log.i(TAG, "signIn get code success."); } else { Log.i(TAG, "signIn get code failed: " + ((ApiException) signInHuaweiIdTask.getException()).getStatusCode()); } } }
  5. 应用客户端将获取到的code上报给应用服务端,再由其调用/oauth2/v3/token接口向华为帐号服务器请求获取ID Token、Access Token、Refresh 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=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn& client_id=12345& code_verifier=123444444dfd4sadfsdwew321454567587658776t896fdfgdscvvbfxdgfdgfdsfasdfsdgd233& redirect_uri=hms%3A%2F%2Fredirect_uri& need_open_uid=true

返回样例:

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": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjExOGRmMjU0YjgzNzE4OWQxYmMyYmU5NjUwYTgyMTEyYzAwZGY1YTQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiI3ODI0NTY2Njc4OTgtc2M0MzE3Y2l0NGEwMjB0NzdrbGdsbWo1ZjA4YWtnMWIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODI0NTY2Njc4OTgtN2NkNGJpYWRkaGVwNGc4cnZic2VlOGtwcDA5Zm1hNzIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDE3MTIxMzkwMzgwNDE2MDc0MTQiLCJlbWFpbCI6Inh1ZXpoZW5odWF0anVAc2luYS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGljdHVyZSI6Imh0dHBzOi8vbGg1Lmdvb2dsZXVzZXJjb250ZW50LmNvbS8tMm9lTTllT09zNTAvQUFBQUFBQUFBQUkvQUFBQUFBQUFBQkkvMVpOSC0xdmxxc3cvczk2LWMvcGhvdG8uanBnIiwiaWF0IjoxNTYxNDUxMTUyLCJleHAiOjE1NjE0NTQ3NTJ9.Eo9IHMkid596jvt1YYzNsRtDq9c9K9dbougkU41Noh7TXNiko86_RuWwHID6k1kDg398AwC3wwH-t2hLcUjgrXPNd9XYU96Jp4-UxdDszP6ywEJgvvBCyTHzsi2auvKt_MnfSrs3qOKfh7noJvXq8AY-Hi3vqSUks5kGqbZKVzCHhBDO3RD9Fs9YHsB6w0XVKZojPOBDaAT_TiijoChn-Q-e8NbSGUx52OgeH-Nw5lOj6JVb_7fb6ucWRzlhiQuzFjklevLVw2pjw1MxKbl1vfRp0X699uZBVjgl9hj1L7LSDObuPzLiXF7ojji5JKYC6zIwAtZQUZ_VUmSk01GDLQ", "scope": "openid profile email", "token_type": "Bearer", "open_id": "MDFAMzAwMDUxODgzQDNiaODc3NTkzNGRlNmNiaMzBlNmQ2YjAzNTgzNTJhMDNjQDkwMGQwYTY1NmE1NmNlNTU1M2EzMWY3Y2VmZWQwOGJlYTRkZTU4ZjM5YWFmOWNhNTk0ODEyZA", }
  1. 由于access token的有效期(目前是60分钟)较短, 当access token失效, 或者即将失效时,可以使用refresh token通过/oauth2/v3/token 接口向华为帐号服务器请求获取新的access token.

请求样例:

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_toekn=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.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiI3ODI0NTY2Njc4OTgtc2M0MzE3Y2l0NGEwMjB0NzdrbGdsbWo1ZjA4YWtnMWIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODI0NTY2Njc4OTgtN2NkNGJpYWRkaGVwNGc4cnZic2VlOGtwcDA5Zm1hNzIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDE3MTIxMzkwMzgwNDE2MDc0MTQiLCJlbWFpbCI6Inh1ZXpoZW5odWF0anVAc2luYS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGljdHVyZSI6Imh0dHBzOi8vbGg1Lmdvb2dsZXVzZXJjb250ZW50LmNvbS8tMm9lTTllT09zNTAvQUFBQUFBQUFBQUkvQUFBQUFBQUFBQkkvMVpOSC0xdmxxc3cvczk2LWMvcGhvdG8uanBnIiwiaWF0IjoxNTYxNDUxMTUyLCJleHAiOjE1NjE0NTQ3NTJ9.Eo9IHMkid596jvt1YYzNsRtDq9c9K9dbougkU41Noh7TXNiko86_RuWwHID6k1kDg398AwC3wwH-t2hLcUjgrXPNd9XYU96Jp4-UxdDszP6ywEJgvvBCyTHzsi2auvKt_MnfSrs3qOKfh7noJvXq8AY-Hi3vqSUks5kGqbZKVzCHhBDO3RD9Fs9YHsB6w0XVKZojPOBDaAT_TiijoChn-Q-e8NbSGUx52OgeH-Nw5lOj6JVb_7fb6ucWRzlhiQuzFjklevLVw2pjw1MxKbl1vfRp0X699uZBVjgl9hj1L7LSDObuPzLiXF7ojji5JKYC6zIwAtZQUZ_VUmSk01GDLQ", "expires_in": 3600, "scope": "openid profile email", "token_type": "Bearer" }

开发完成后,点击图标,运行AndroidStudio工程打包生成APK,并安装在测试手机上。运行界面如下图所示:

干得好,你已经成功完成了Codelab并学到了:

帐号服务相关API介绍
本次Codelab使用的DEMO源码下载。

源码下载

已复制代码