• 如何快速集成Android版Serverless认证服务-手机号码篇


    大部分的应用都需要对用户的业务访问进行身份认证,以便为用户提供个性化体验。但是端到端完整构建一套用户认证系统会面临很多挑战。认证服务可以为应用快速构建安全可靠的用户认证系统,开发者只需在应用中访问认证服务的相关能力,而不需要关心云侧的设施和实现。今天就来教大家如何快速集成AGConnect的认证服务中的手机号码认证方式。

    1、在AGC上开通认证服务并启用手机号码认证方式:

    我的项目 下选择你的开发项目,在构建下面,找到认证服务服务,点击开通:

    没有Android项目的话,可以先自己创建一个。开通认证服务后,我们可以看到一列认证方式,找到手机号码认证方式,点击右侧的启用按钮将认证服务启用。

    1.png

    2、在Android项目里集成SDK

    a) 集成SDK

    1、在项目级的gradle文件中添加华为Maven,即配置下面标红的内容

    1. buildscript {
    2. repositories {
    3. google()
    4. jcenter()
    5. maven {url 'https://developer.huawei.com/repo/'}
    6. }
    7. dependencies {
    8. classpath 'com.android.tools.build:gradle:4.0.1'
    9. classpath 'com.huawei.agconnect:agcp:1.5.2.300'
    10. }
    11. }
    12. allprojects {
    13. repositories {
    14. google()
    15. jcenter()
    16. maven {url 'https://developer.huawei.com/repo/'}
    17. }
    18. }
    19. task clean(type: Delete) {
    20. delete rootProject.buildDir
    21. }

    2、打开应用级的build.gradle文件,配置好华为认证服务的SDK,配置下面标红的内容即可。  注意别落了上面的agcp插件

    1. apply plugin: 'com.android.application'
    2. apply plugin: 'com.huawei.agconnect'
    3. android {…..}
    4. dependencies {
    5. implementation fileTree(include: ['*.jar'], dir: 'libs')
    6. implementation 'androidx.appcompat:appcompat:1.1.0'
    7. implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    8. testImplementation 'junit:junit:4.12'
    9. androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    10. androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    11. implementation 'com.huawei.agconnect:agconnect-auth:1.5.2.300'
    12. }

    b) 下载json文件,并且配置默认存储实例

    1、在AGC界面上,选择 我的项目 -> 项目设置–> 常规 下面,下载agconnect-services.json文件到你的Android项目的app路径下。

    2.png

    3、功能开发:

    对于手机号码认证,认证服务SDK提供了两个阶段的操作,一个是注册,另一个是登录。这两个操作都需要用到获取短信验证码的功能,所以认证服务SDK也提供了发送验证码的功能:

    1. 发送验证码的步骤如下:
      1. VerifyCodeSettings settings = VerifyCodeSettings.newBuilder()
      2.             .action(VerifyCodeSettings.ACTION_REGISTER_LOGIN)
      3.             .sendInterval(30) //shortest send interval ,30-120s
      4.             .locale(Locale.SIMPLIFIED_CHINESE) //optional,must contain country and language eg:zh_CN
      5.             .build();

      首先我们需要创建一个VerifyCodeSettings对象,里面包含了发送短信的相关设置,包括action,语言等

    读取用户输入的国家码与手机号,调用RequestVerifyCode方法向认证服务服务器请求发送验证码,传入国家码,手机号以及刚刚我们创建的setting对象

    1. String countCode = countryCode.getText().toString().trim();
    2.     String phoneNumber = phoneNumeber.getText().toString().trim();
    3.     if (notEmptyString(countCode) && notEmptyString(phoneNumber)) {
    4.         Task<VerifyCodeResult> task = PhoneAuthProvider.requestVerifyCode(countCode, phoneNumber, settings);
    5.         task.addOnSuccessListener(TaskExecutors.uiThread(), new OnSuccessListener<VerifyCodeResult>() {
    6.             @Override
    7.             public void onSuccess(VerifyCodeResult verifyCodeResult) {
    8.                 Toast.makeText(MainActivity.this, "verify code has been sent.", Toast.LENGTH_SHORT).show();
    9.             }
    10.         }).addOnFailureListener(TaskExecutors.uiThread(), new OnFailureListener() {
    11.             @Override
    12.             public void onFailure(Exception e) {
    13.                 Toast.makeText(MainActivity.this, "Send verify code failed.", Toast.LENGTH_SHORT).show();
    14.                 Log.e(TAG, "requestVerifyCode fail:" + e);
    15.             }
    16.         });
    17.     } else {
    18.         Toast.makeText(MainActivity.this, "Please enter the phone number and country code", Toast.LENGTH_SHORT).show();
    19.     }

         2. 用户获取验证码后就可以开始注册流程了

    首先我们需要读取用户的输入并构建一个PhoneUser对象,里面存放了手机用户的相关信息,包括手机号,国家码,验证码和密码。这里用户在创建的时候可以选择是否设置密码,如果设置则后续在登录的时候就需要输入密码。PhoneUser创建成功后我们就可以调用CreateUser方法创建用户了

    1. PhoneUser phoneUser = new PhoneUser.Builder()
    2.         .setCountryCode(countryCode)
    3.         .setPhoneNumber(accountNumber)
    4.         .setVerifyCode(verifyCode)
    5.         .setPassword(password)
    6.         .build();
    7. AGConnectAuth.getInstance().createUser(phoneUser).addOnSuccessListener(signInResult -> {
    8.     String phoneNumber = signInResult.getUser().getPhone();
    9.     String uid = signInResult.getUser().getUid();
    10.     Bundle data = new Bundle();
    11.     data.putString("phone", phoneNumber);
    12.     data.putString("uid", uid);
    13.     Intent intent = new Intent(RegisterActivity.this, ImageListActivity.class);
    14.     intent.putExtras(data);
    15.     startActivity(intent);
    16.     finish();
    17. }).addOnFailureListener(e -> {
    18.     Log.e(TAG, "register error, " + e);
    19.     ToastUtils.showToast(RegisterActivity.this, "Register failed. "+e.getMessage());
    20. });

    用户创建完成后,SDK会自动为用户进行登录,无需再调用登录接口了

           3. 对于非首次使用的用户,我们就需要进行登录操作了,基于之前注册时的设置,登录分为两种,验证码登录和密码登录,如果是密码登录,我们调用的是CredentialwithPassword来创建一个credential,而验证码登录则是使用CredentialWithVerifyCode来创建credential。而后我们调用SignIn方法传入这个credential进行登录的操作。这里给大家展示一下验证码登录的示例

    1. private void phoneLogin(String phoneAccount, String photoPassword) {
    2.     String countryCode = "86";
    3.     AGConnectAuthCredential credential = PhoneAuthProvider.credentialWithVerifyCode(
    4.             countryCode,
    5.             phoneAccount,
    6.             photoPassword,
    7.             null ); // password, can be null
    8.     AGConnectAuth.getInstance().signIn(credential).addOnSuccessListener(signInResult -> {
    9.        String phoneNumber = signInResult.getUser().getPhone();
    10.         String uid = signInResult.getUser().getUid();
    11.         signInResult.getUser().getToken(true).addOnSuccessListener(new OnSuccessListener<TokenResult>() {
    12.             @Override
    13.             public void onSuccess(TokenResult tokenResult) {
    14.                 String token = tokenResult.getToken();
    15.                 Log.i("getToken", token);
    16.             }
    17.         });
    18.         Bundle data = new Bundle();
    19.         data.putString("account", this.getString(R.string.phone_user)+phoneNumber.substring(11, 15));
    20.         data.putString("uid", uid);
    21.         ToastUtils.showToast(LoginActivity.this, "Login Success");
    22.         Intent intent = new Intent(LoginActivity.this, ImageListActivity.class);
    23.         intent.putExtras(data);
    24.         startActivity(intent);
    25.         finish();
    26.     }).addOnFailureListener(e -> {
    27.         Log.e(TAG, "Login failed: " + e.getMessage());
    28.         ToastUtils.showToast(LoginActivity.this, "Account Error,Confirm and try again");
    29.     });
    30. }

    以上我们就成功接入了Android版本认证服务中的手机账号认证。如果觉得简单那就赶快行动起来试试吧。

  • 相关阅读:
    35m预应力简支梁桥毕业设计 课程设计-桥梁工程(计算书、8张CAD图)
    Spring神器:Environment环境配置
    腾讯云SSH连接不上的一个解决办法
    【多光谱与高光谱图像融合:金字塔混洗Transformer】
    Excel VSTO开发5 -Excel对象结构
    如何配置群辉相册Synology Photos实现公网访问并与朋友共享照片
    杂记:数据库go,begin,end,for,after,instead of
    安装这个IIS-Applicationlnit
    商城项目04_SpringCloud Alibaba概述、Nacos作为注册、配置中心、声明式远程调用Feign
    安装及管理docker
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/125439851