什么是AppGallery Connect认证服务?

AppGallery Connect认证服务提供了云侧服务和SDK,可以帮助开发者为应用快速构建安全可靠的用户认证系统,以便应用可以对用户进行身份认证。AppGallery Connect认证服务支持多种认证方式,并与其他Serverless服务紧密集成,开发者可以通过简单的规则定义来保护用户的数据安全。
通过集成AppGallery Connect认证服务提供的Auth Service SDK,开发者可以对接包括华为帐号、微信、Facebook、Twitter在内的多种第三方用户认证系统,并将认证凭据上报给AppGallery Connect认证服务云侧。在下次登录时应用可直接对接AppGallery Connect认证服务以获取用户的基本个人资料和其他Serverless服务中的受安全规则保护的数据。
通过AppGallery Connect认证服务,可以极大减少开发者在用户认证系统构建和运维上的投入和成本。

您将建立什么?

在本次Codelab中,您将建立一个能够具备使用AppGallery Connect认证服务认证华为帐号、微信登录功能的Android应用程序,您的应用程序将包含:

您将学会到什么

您需要什么?

开发环境及技能要求:

运行终端要求:

集成AppGallery Connect认证服务,需要完成以下准备工作

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

打开相关服务

  1. 在AppGallery Connect的应用页面中点击"开发"页签,点击"概览"后的图标,选择"API管理"。
  2. 点击 "HUAWEI Analytics"、"Auth Service"和"HUAWEI Account"后面的开关打开华为分析服务、AppGallery Connect认证服务和华为帐号服务。

启动认证方式

  1. 在AppGallery Connect的应用页面中点击"开发"页签,导航选择"Serverless > 认证服务"。如果首次使用认证服务,请点击"立即开通"开通服务。
  2. 点击需要启动的认证方式所在行的"启用"。国内只支持"华为"和"微信"。
  3. 在弹出框中,配置应用的相关信息。

启动华为分析服务

华为分析服务需要手动启动并签署协议。

  1. 登录AppGallery Connect网站,选择"分析"。
  2. 点击对应应用进入应用分析页面。
  3. 选择"高级分析",点击"启动分析服务"。
  4. 详细阅读分析服务条款及华为作为数据处理者的隐私声明,勾选后点击"同意"签署协议并完成配置。
  5. 如果项目接入设置尚未配置,会进入项目接入设置页面,设置后单击"完成"。

集成SDK

针对Android Studio开发环境,华为提供了maven仓集成方式的SDK包,开发前需集成SDK到您的Android Studio项目中。

  1. 在AppGallery Connect的应用页面中点击"开发"页签,选择"概览"。
  2. 单击"应用"栏下的"agconnect-services.json"下载配置文件。
  3. 将"agconnect-services.json"文件拷贝到应用级根目录下。
  4. 打开Android Studio项目级build.gradle文件。
  5. 在build.gradle文件的对应位置配置以下内容。
    allprojects { repositories { google() jcenter() //配置如下地址 maven {url 'http://developer.huawei.com/repo/'} } } buildscript { repositories { google() jcenter() //配置如下地址 maven {url 'http://developer.huawei.com/repo/'} } } buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.4.0' //配置如下地址 classpath 'com.huawei.agconnect:agcp:1.0.0.300' } }
  6. 打开Android Studio应用级build.gradle文件。
  7. 在对应位置配置华为帐号服务地址、AppGallery Connect认证服务SDK地址和华为分析服务地址。
    //配置如下地址 apply plugin: 'com.huawei.agconnect' dependencies { //配置如下地址 implementation 'com.huawei.hms:hwid:3.0.0.303' implementation 'com.huawei.agconnect:agconnect-auth:1.0.0.301' implementation 'com.huawei.hms:hianalytics:2.3.0.301' }
  8. 接入微信的相关配置请参考微信官方文档

  9. 点击界面上的"Sync Now"链接同步已完成的配置。

配置混淆脚本

  1. 打开Android Studio工程的混淆配置文件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.**{*;} -keep class com.huawei.gamebox.plugin.gameservice.**{*;}

本次Codelab中您可以在您的Android Studio工程中创建一个布局页面,参照下图进行UI设计,具备简单的华为帐号、微信登录入口即可。

步骤1 在应用启动的onCreate方法中初始化华为分析服务。

HiAnalyticsTools.enableLog(); HiAnalyticsInstance instance = HiAnalytics.getInstance(this);

步骤2 在应用的登录界面,初始化 AGConnectAuth 实例,获取 AppGallery Connect 的用户信息,检查是否有已经登录的用户,如果有则可以直接进入用户界面,否则显示登录界面。同时具备帐号注销登录功能。

public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); LoginStateViewModel loginStateViewModel = ViewModelProviders.of(requireActivity()).get(LoginStateViewModel.class); binding.logout.setOnClickListener(v -> { loginStateViewModel.logout(); }); AGConnectUser user = loginStateViewModel.getUser(); Utils.loadCircleImage(requireContext(), user.getPhotoUrl(), binding.icon); binding.name.setText(user.getDisplayName()); binding.provider.setText(providerName(user.getProviderId())); } private String providerName(String providerId) { switch (providerId) { case "1": return "HuaWei"; case "4": return "WeiXin"; default: return ""; } }

loginStateViewModel.getUser定义如下

public AGConnectUser getUser() { AGConnectUser user = AGConnectAuth.getInstance().getCurrentUser(); if (user != null) { Log.d("LoginFlow", " agc user uid : " + user.getUid()); } else { Log.d("LoginFlow", " agc user is null"); } return user; }

loginStateViewModel.logout定义如下

public void logout() { AGConnectAuth.getInstance().signOut(); isLogin.setValue(false); }

步骤3 注册Token变更监听。
开发者可以注册 Token 事件监听,当发生以下事件时,开发者将会收到通知:

public LoginStateViewModel() { isLogin = new MutableLiveData<>(); isLogin.setValue(getUser() != null); AGConnectAuth.getInstance().addTokenListener(this::onChanged); } private void onChanged(TokenSnapshot tokenSnapshot) { if (tokenSnapshot.getToken() == null) { isLogin.setValue(false); } }

步骤1 选择华为帐号登录后,华为帐号的用户授权应用使用此帐号的相关信息。

binding.hms.setOnClickListener(v -> { Log.d("LoginFlow", "HMS Start Sign In"); HuaweiIdSignInOptions signInOptions = new HuaweiIdSignInOptions.Builder(HuaweiIdSignInOptions.DEFAULT_SIGN_IN).requestAccessToken() .requestIdToken("").requestId().requestUid().build(); HuaweiIdSignInClient client = HuaweiIdSignIn.getClient(this.getActivity(), signInOptions); startActivityForResult(client.getSignInIntent(),8888 ); })

步骤2 在登录结果的回调中增加华为帐号授权AppGallery Connect认证服务,由AppGallery Connect认证服务来提供AppGallery Connect的用户信息。
在登录成功的处理中加入向华为分析服务上报自定义事件的代码。

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 8888) { LoginStateViewModel loginStateViewModel = ViewModelProviders.of(requireActivity()).get(LoginStateViewModel.class); HiAnalyticsInstance instance = HiAnalytics.getInstance(this.getActivity()); Task<SignInHuaweiId> signInHuaweiIdTask = HuaweiIdSignIn.getSignedInAccountFromIntent(data); if (signInHuaweiIdTask.isSuccessful()) { Log.d("LoginFlow", "HMS Sign In Success"); //向华为分析服务上报自定义事件 Bundle bundle = new Bundle(); bundle.putString(" Login Type ","hwid"); bundle.putString(" Login Result ","success"); instance.logEvent("AGC_Auth_Service_Sample", bundle); //登录成功,获取用户的华为帐号信息和ID Token SignInHuaweiId huaweiAccount = signInHuaweiIdTask.getResult(); Log.d("LoginFlow", "unionid : " + huaweiAccount.getUnionId()); Log.d("LoginFlow", "openId : " + huaweiAccount.getOpenId()); Log.d("LoginFlow", "uid:" + huaweiAccount.getUid()); Log.d("LoginFlow", "accessToken : " + huaweiAccount.getAccessToken()); //授权AppGallery Connect认证服务 AGConnectAuthCredential credential = HwIdAuthProvider.credentialWithToken(huaweiAccount.getAccessToken()); loginStateViewModel.login(credential); }else{ //登录失败,不需要做处理,打点日志方便定位 Log.d("LoginFlow", "sign in failed : " + ((ApiException)signInHuaweiIdTask.getException()).getStatusCode()); //打点并上报自定义事件 Bundle bundle = new Bundle(); bundle.putString(" Login Type ","hwid"); bundle.putString(" Login Result ","failed"); instance.logEvent("AGC_Auth_Service_Sample", bundle); } } callbackManager.onActivityResult(requestCode, resultCode, data); }

loginStateViewModel.login定义如下:

public void login(AGConnectAuthCredential credential) { AGConnectAuth.getInstance().signIn(credential).addOnSuccessListener((signInResult -> { Log.d("LoginFlow", "AGConnect Sign In Success"); isLogin.setValue(true); })).addOnFailureListener(exception -> { Log.d("LoginFlow", "AGConnect Sign In Fail : " + exception.getMessage() ); isLogin.setValue(false); }); }

步骤1 初始化IWXAPI

public static void setContext(Context context) { WeiXinHelper.getInstance().api = WXAPIFactory.createWXAPI(context, APP_ID, false); WeiXinHelper.getInstance().api.registerApp(APP_ID); }

步骤2 发送请求获取微信授权的code。

public void signIn() { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "none"; api.sendReq(req); }

步骤3 在包名同文件夹下创建wxapi文件夹,添加WXEntryActivity.java类。

package com.lucky.agc.demo.wxapi; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import androidx.annotation.Nullable; import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; import com.tencent.mm.opensdk.modelmsg.SendAuth; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; public class WXEntryActivity extends Activity implements IWXAPIEventHandler { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { Intent intent = getIntent(); WeiXinHelper.getInstance().getApi().handleIntent(intent, this); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); WeiXinHelper.getInstance().getApi().handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp baseResp) { Log.d("LoginFlow", "WeiXin onResp"); if (baseResp.getType() == ConstantsAPI.COMMAND_SENDAUTH) { SendAuth.Resp authResp = (SendAuth.Resp) baseResp; WeiXinHelper.getInstance().getToken(authResp.code); } finish(); } }

步骤4 请求获取accessToken和openId。

public void getToken(String code) { WXTokenRequest request = new WXTokenRequest(); request.code = code; request.appid = APP_ID; request.secret = SECRET_ID; Log.d("LoginFlow", "WeiXin Send Token Request"); Backend.call(request, Backend.METHOD_TYPE.POST, WXTokenResponse.class) .addOnSuccessListener(wxTokenResponse -> { getCallback().onSuccess(wxTokenResponse.access_token, wxTokenResponse.openid); }).addOnFailureListener(e -> { getCallback().onFail(); }); }

步骤5 微信帐号授权AppGallery Connect认证服务,由AppGallery Connect认证服务来提供用户信息。
将微信帐号的accessToken和openId传递给AppGallery Connect服务器,返回 AppGallery Connect 的用户信息。
在登录成功的处理中向华为分析服务上报自定义事件。

binding.weixin.setOnClickListener(v -> { Log.d("LoginFlow", "WeiXin Start Sign In"); WeiXinHelper.getInstance().signIn(); }); WeiXinHelper.getInstance().setCallback(new WeiXinHelper.Callback() { @Override public void onSuccess(String accessToken, String openId) { Log.d("LoginFlow", "WeiXin Sign In Success"); //向华为分析服务上报自定义事件 Bundle bundle = new Bundle(); bundle.putString(" Login Type ","weixin"); bundle.putString(" Login Result ","success"); instance.logEvent("AGC_Auth_Service_Sample", bundle); AGConnectAuthCredential credential = WeixinAuthProvider.credentialWithToken(accessToken,openId); loginStateViewModel.login(credential); } @Override public void onFail() { Log.d("LoginFlow", "WeiXin Sign In Fail"); Bundle bundle = new Bundle(); bundle.putString(" Login Type ","weixin"); bundle.putString(" Login Result ","failed"); instance.logEvent("AGC_Auth_Service_Sample", bundle); } });
  1. 参考创建测试帐号添加您的华为帐号作为测试帐号。
  2. 运行Android Studio工程生成APK包,并在测试手机中安装APK包。
  3. 测试华为帐号、微信的帐号登录功能。
  4. 测试实时分析功能。
    在应用分析页面选择"高级分析",在左侧导航栏选择"实时分析",同时在测试APP中进行登录登出操作,观察实时分析的数据变化。

祝贺您,您已经成功地构建了您的第一个集成AppGallery Connect认证服务的应用程序,并学到了:

本Codelab中所用demo源码下载地址如下:

源码下载

已复制代码