• 【AGC】构建服务3-认证服务示例


    前言:上一次笔者给大家带来了AGC领域的App Linking的学习。这次我们再继续深化学习AGC的相关知识。在文章开始之前,再给读者简单介绍一下AGC,以免第一次来的读者不了解。所谓AGC就是AppGallery Connect的简称,为用户的应用进行创意、开发、分发、运营、经营各环节提供一站式服务,说的通俗一点,就是给用户在华为应用市场上架运营应用提供全面的服务。

    全部的AGC相关的知识分为两大类,一大类即上架相关,这个可以参考链接:https://developer.huawei.com/consumer/cn/doc/distribution/app/agc-help-overview-0000001100246618。里面提供了像是应用测试、应用发布、应用管理、应用维护等应用市场相关的内容。另一大类则是为开发者提供了各种帮助Kit,这个可以参考链接:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-introduction-0000001057492641。里面提供了像是云存储、A/B测试、质量分析、华为云等Kit,为开发者提供额外的帮助,辅助开发者更好的完成应用上架、提高应用质量、增加用户粘性等。

    由于AGC全部的内容太多了,所以每一次的学习我们尽量讲其中一点,讲得详细一点。这一次我们来学习构建服务的认证服务的功能。这个功能可以为应用快速构建安全可靠的用户认证系统,只需在应用中访问认证服务的相关能力,而不需要关心云侧的设施和实现。认证服务提供了SDK和后端服务,内置了对多种认证方式的支撑,提供了功能强大的管理台,能够轻松完成用户认证的开发和管理工作。认证服务的SDK支持多种平台和语言,无论用户使用何种类型的终端,都能获得统一的登录体验和用户身份。认证服务作为Serverless服务的一种可与其他Serverless服务自动适配,可以通过简单的规则定义来保护用户在Serverless服务中的数据安全。

    认证服务的主要功能:1、手机帐号,通过手机号码来对用户进行身份认证,用户可以使用手机号码和密码或者手机号码和验证码来登录应用。认证服务提供了基于手机号码的注册、登录、密码修改、密码重置、验证短信推送等能力和接口。2、邮箱帐号,通过邮箱地址来对用户进行身份认证,用户可以使用邮箱地址和密码或者邮箱地址和验证码来登录应用。认证服务提供了基于邮箱地址的注册、登录、密码修改、密码重置、验证邮件推送等能力和接口。3、第三方帐号,通过第三方认证服务对用户进行身份认证。用户可以使用第三方帐号来登录应用。4、自有帐号,如果您已经自行构建了认证系统,您可以通过自有帐号对接来让您已构建的认证系统与认证服务协同工作,以实现如下目的。让认证服务来提供您的自有认证系统所不具备的认证方式;让您自有认证系统中的用户以安全的方式访问其他Serverless服务(比如云数据库、云存储等)。5、匿名帐号支持应用的游客访问模式。认证服务可以为您的游客分配用户标识,使您能够识别不同的游客并为他们提供差异化的服务,并且使您的游客能够以安全的方式访问其他Serverless服务。游客可通过关联其他认证方式来转化成为正式用户,并保留其原来的用户标识不变,以使其业务保持连贯。

    认证服务的实现流程。1、启用认证方式,在认证服务控制台启用您想要支持的认证方式,并按照界面引导提供必要的配置信息。对于第三方帐号认证,需要提供在第三方认证系统中申请的应用标识及秘钥。2、在应用客户端实现登录界面流程,在应用客户端代码中实现用户登录所需的界面流程:1)对于手机帐号和邮箱帐号认证,请实现用户输入帐号信息、密码或者验证码信息界面流程,并且实现注册、登录、密码修改、密码重置、验证码推送等流程。2)对于第三方帐号认证,需要按照第三方认证系统的要求实现登录界面流程。3)对于匿名帐号认证,您需要帮助或引导游客完成匿名登录。4)对于自有帐号认证,您可以保持您原有的登录体验,并在流程中增加认证服务所需Token的生成和传递。3、端侧集成认证服务SDK,在应用的端侧代码中集成认证服务SDK,并通过认证服务SDK上报认证凭据、接收认证结果。

    接下来就跟着笔者的脚步来完成一个简单的认证服务。因为此处只是演示用,所以部分内容进行了简化。认证服务还可以支持其他平台,读者可以自行探索。

    1、集成SDK

    1)在AGC网站的我的项目中选择需要启用认证服务的应用,点击构建->认证服务,进入认证服务页面,立即开通服务,点击“手机号码”的认证方式所在行的"启用"。我这边是已经开通的状态。

    2)登录AGC网站,点击我的项目,在项目设置的应用栏下,下载配置文件"agconnect-services.json"。将配置文件复制到应用级根目录下。

    3)添加AGC插件,在Android Studio项目级build.gradle文件中添加maven仓地址和HUAWEI agc插件。

    4)打开Android Studio应用级build.gradle文件,添加添加agcp插件配置和agc-auth编译依赖。

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

    2、界面设计

    1)在Android Studio工程中创建一个布局页面,参照下图进行UI设计,具备输入国家码、手机号与验证码的输入框以及获取验证码与登录的按钮。

    Xml布局代码:

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".Activity.LoginActivity">
    8. <TextView
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:text="Welcome to AGC usecase"
    12. android:textSize="24dp"
    13. android:textAlignment="center"
    14. app:layout_constraintBottom_toBottomOf="parent"
    15. app:layout_constraintLeft_toLeftOf="parent"
    16. app:layout_constraintRight_toRightOf="parent"
    17. app:layout_constraintTop_toTopOf="parent"
    18. app:layout_constraintVertical_bias="0.2" />
    19. <LinearLayout
    20. android:layout_width="wrap_content"
    21. android:layout_height="wrap_content"
    22. android:orientation="horizontal"
    23. app:layout_constraintBottom_toBottomOf="parent"
    24. app:layout_constraintHorizontal_bias="0.5"
    25. app:layout_constraintLeft_toLeftOf="parent"
    26. app:layout_constraintRight_toRightOf="parent"
    27. app:layout_constraintTop_toTopOf="parent"
    28. app:layout_constraintVertical_bias="0.35">
    29. <EditText
    30. android:id="@+id/et_countryCode"
    31. android:layout_width="60dp"
    32. android:layout_height="40dp"
    33. android:layout_marginRight="10dp"
    34. android:hint="国家码"
    35. android:layout_marginLeft="20dp"
    36. android:inputType="number"
    37. />
    38. <EditText
    39. android:id="@+id/et_phoneNumber"
    40. android:layout_width="200dp"
    41. android:layout_height="40dp"
    42. android:layout_marginRight="20dp"
    43. android:hint="请输入手机号"
    44. android:inputType="number"/>
    45. </LinearLayout>
    46. <LinearLayout
    47. android:layout_width="wrap_content"
    48. android:layout_height="wrap_content"
    49. app:layout_constraintBottom_toBottomOf="parent"
    50. app:layout_constraintHorizontal_bias="0.5"
    51. app:layout_constraintLeft_toLeftOf="parent"
    52. app:layout_constraintRight_toRightOf="parent"
    53. app:layout_constraintTop_toTopOf="parent"
    54. app:layout_constraintVertical_bias="0.45">
    55. <EditText
    56. android:id="@+id/et_verifyCode"
    57. android:layout_width="170dp"
    58. android:layout_height="match_parent"
    59. android:layout_marginLeft="20dp"
    60. android:hint="请输入验证码"
    61. android:inputType="number" />
    62. <Button
    63. android:id="@+id/bt_obtain"
    64. android:layout_width="100dp"
    65. android:layout_height="wrap_content"
    66. android:layout_marginRight="10dp"
    67. android:layout_marginLeft="20dp"
    68. android:textSize="15sp"
    69. android:text="验证码" />
    70. </LinearLayout>
    71. <LinearLayout
    72. android:layout_width="200dp"
    73. android:layout_height="45dp"
    74. android:gravity="center_horizontal"
    75. app:layout_constraintBottom_toBottomOf="parent"
    76. app:layout_constraintHorizontal_bias="0.5"
    77. app:layout_constraintLeft_toLeftOf="parent"
    78. app:layout_constraintRight_toRightOf="parent"
    79. app:layout_constraintTop_toTopOf="parent"
    80. app:layout_constraintVertical_bias="0.7">
    81. <Button
    82. android:id="@+id/bt_phoneLogin"
    83. android:layout_width="match_parent"
    84. android:layout_height="match_parent"
    85. android:layout_gravity="center_horizontal"
    86. android:text="手机号登录"
    87. android:textSize="18sp" />
    88. </LinearLayout>
    89. </androidx.constraintlayout.widget.ConstraintLayout>

    3、认证服务sdk接入代码实现

    1)在EditText中分别输入国家码与手机号,点击验证码按钮调用requestVerifyCode方法获取验证码,SDK向认证服务服务器请求发送验证码,将接收到的验证码输入到验证码EditText中。

    1. //发送验证码方法
    2. public void sendVerifyCode() {
    3. VerifyCodeSettings settings = VerifyCodeSettings.newBuilder()
    4. .action(VerifyCodeSettings.ACTION_REGISTER_LOGIN)
    5. .sendInterval(30)
    6. .locale(Locale.SIMPLIFIED_CHINESE)
    7. .build();
    8. String countryCode = et_countryCode.getText().toString().trim();
    9. String phoneNumber = et_phoneNumber.getText().toString().trim();
    10. if (notEmptyString(countryCode) && notEmptyString(phoneNumber)) {
    11. Task<VerifyCodeResult> task = PhoneAuthProvider.requestVerifyCode(countryCode, phoneNumber, settings);
    12. task.addOnSuccessListener(TaskExecutors.uiThread(), new OnSuccessListener<VerifyCodeResult>() {
    13. @Override
    14. public void onSuccess(VerifyCodeResult verifyCodeResult) {
    15. Toast.makeText(LoginActivity.this, "验证码已发送。",
    16. Toast.LENGTH_SHORT).show();
    17. }
    18. }).addOnFailureListener(TaskExecutors.uiThread(), new OnFailureListener() {
    19. @Override
    20. public void onFailure(Exception e) {
    21. Toast.makeText(LoginActivity.this, "发送验证码失败。" + e,
    22. Toast.LENGTH_SHORT).show();
    23. Log.e(TAG, "requestVerifyCode fail:" + e);
    24. }
    25. });
    26. } else {
    27. Toast.makeText(LoginActivity.this, "请输入电话号码和国家码。",
    28. Toast.LENGTH_SHORT).show();
    29. }
    30. }

    2)点击手机号登录按钮,利用国家码、手机号和接收到的验证码构造关联帐号所需要的凭证。

    调用AGConnectAuth.signIn使用生成的credential凭证进行手机号码的认证,打印手机用户uid到按钮下方的TextView

    1. //电话号码登录方法
    2. public void phoneLogin(){
    3. String countryCode = et_countryCode.getText().toString().trim();
    4. String phoneNumber = et_phoneNumber.getText().toString().trim();
    5. String verifyCode = et_verifyCode.getText().toString().trim();
    6. //登录逻辑
    7. AGConnectAuthCredential credential = PhoneAuthProvider.credentialWithVerifyCode(
    8. countryCode,
    9. phoneNumber,
    10. null, // password, can be null
    11. verifyCode);
    12. AGConnectAuth.getInstance().signIn(credential)
    13. .addOnSuccessListener(new OnSuccessListener<SignInResult>() {
    14. @Override
    15. public void onSuccess(SignInResult signInResult) {
    16. //获取登录信息
    17. String uid = signInResult.getUser().getUid();
    18. String phoneNumber = signInResult.getUser().getPhone();
    19. redirect(uid,phoneNumber);
    20. }
    21. })
    22. .addOnFailureListener(new OnFailureListener() {
    23. @Override
    24. public void onFailure(Exception e) {
    25. Toast.makeText(LoginActivity.this, "登录失败。" +e.getMessage(),
    26. Toast.LENGTH_SHORT).show();
    27. Log.e(TAG, "Login error, error:" + e.getMessage());
    28. }
    29. });
    30. }

     3)判断string不为空方法

    1. //判断string不为空方法
    2. public Boolean notEmptyString(String string){
    3. if (string == null || "".equals(string)){
    4. return false;
    5. }else {
    6. return true;
    7. }
    8. }

    4、打包测试

    1)运行Android Studio工程生成APK包,在测试手机中安装APK包。

    2)在界面输入国家码和手机号后,点击验证码按钮获取验证码。

    3)获取验证码后在验证码栏输入验证码,点击登录按钮进行手机号码登录。我这里是登录后会跳转到主界面效果。

    以上,本次的内容分享,谢谢!

    欲了解更多详情,请参见:
    华为官网:
    https://developer.huawei.com/consumer/cn/forum/topic/0203912789884890322?fid=0101271690375130218?ha_source=zzh

  • 相关阅读:
    Vuejs中字符串判空处理--如何判断字符串是否为空或不为空
    九、kotlin的泛型
    javaweb唐院寻人表白系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    Mysql高级——索引优化和查询优化(3)
    AQS之共享锁分析
    不要62——数位dp打卡
    Java程序处理不同数据库时间类型
    【ros】解决protobuf的安装问题
    什么是网络编程
    Centos7 安装 Docker
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/125520719