快速集成认证服务-HarmonyOS平台

  我们可以通过在应用中集成认证服务SDK来轻松快速地向用户推出注册、登录等相关功能。下面来介绍如何在HarmonyOS平台集成使用AGC认证服务。

集成内容

通过harmony sdk插件集成AGC 验证服务,在AGC上开启认证服务,并添加手机验证与邮箱验证两种方式,同时端侧集成SDK调用后由AGC发送验证码至手机或邮箱,输入验证码和密码后完成用户注册。

集成准备

  1. 安装DevEco Studio开发工具,并熟悉Harmony应用的开发流程
  2. AGC创建工程并开通服务。

        a)在AGC创建Harmony应用并开通验证服务。

cke_202.png

cke_203.png

启用手机和邮箱验证

cke_204.png

3、DevEco Studio中创建Harmony工程

     a)打开IDE工具,选择File-New-New project,选择Java语言编译模板后,点击Next进入创建工程配置界面。

cke_205.png

注意选择应用(Application),包名和AGC创建的应用包名相同。

cke_206.png

  b)将agconnect-services.json文件拷贝到项目的entry模块的目录下

cke_207.png

c)配置Maven仓地址和AGC插件地址。

  打开harmony项目级build.gradle文件。

  在allprojects ->repositories里面配置maven仓地址。

  在buildscript->repositories中配置maven仓地址。

  在buildscript->dependencies中配置AppGallery Connect插件地址。

测试环境需要配置内部私仓地址,正式环境需要配置外部正式仓。

buildscript {
    repositories {
        maven {
            url 'https://repo.huaweicloud.com/repository/maven/'
        }
        maven {
            url 'https://developer.huawei.com/repo/'
        }
        maven { url 'http://language.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/product_maven' }
        maven { url 'http://szg1.artifactory.inhuawei.com/artifactory/sz-maven-public/' }
        jcenter()
    }
    dependencies {
        classpath 'com.huawei.ohos:hap:2.4.4.2'
        classpath 'com.huawei.ohos:decctest:1.2.4.0'
        classpath 'com.huawei.agconnect:agcp-harmony:1.2.0.200'
    }
}

allprojects {
    repositories {
        maven {
            url 'https://repo.huaweicloud.com/repository/maven/'
        }
        maven {
            url 'https://developer.huawei.com/repo/'
        }
        maven { url 'http://language.cloudartifact.dgg.dragon.tools.huawei.com/artifactory/product_maven' }
        maven { url 'http://szg1.artifactory.inhuawei.com/artifactory/sz-maven-public/' }
        jcenter()
    }
}

d)添加编译依赖和集成SDK。

打开harmony项目应用级(entry)build.gradle文件,添加插件地址。

apply plugin: 'com.huawei.ohos.hap'
apply plugin: 'com.huawei.ohos.decctest'
apply plugin: 'com.huawei.agconnect'

在“dependencies”中添加添加agconnect-core的编译依赖和crash SDK

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
    implementation 'com.huawei.agconnect:agconnect-auth-harmony:1.2.0.1-snapshot'
    implementation 'com.huawei.agconnect:agconnect-tasks-harmony:1.2.0.1-snapshot'
}

e)entry (hap)模块添加配置信息

enrty模块的config.json文件的module/abilities中,加入如下配置,注意包名的替换。

{
  "permissions": [
    "com.huawei.agconnect.core.DataAbilityShellProvider.PROVIDER"
  ],
  "name": "com.huawei.agconnect.core.provider.AGConnectInitializeAbility",
  "type": "data",
  "uri": "dataability://com.huawei.agconnect.auth.AGConnectInitializeAbility"
}

f)同步工程配置

1.png

4、配置签名信息

Harmony应用安装到真机进行测试,需要配置签名信息,有手动签名和自动签名两种方式,具体可以参见:配置签名信息。建议优先使用自动签名方式,如自动签名失败,可以选择手动签名方式。这里使用自动签名方式:

a)连接真机设备,确保DevEco Studio与真机设备已连接,真机连接成功后如下图所示

image.png

b)进入File > Project Structure > Project > Signing Configs界面,点击“Sign In”按钮进行登录,选择Debug,勾选Automatically generate signing,点击try again即可自动进行签名。自动生成签名所需的密钥(.p12)、数字证书(.cer)和Profile文件(.p7b)会存放到用户user目录下的.ohos\config目录下。

image.png

设置完签名信息后,点击OK进行保存,然后可以在工程下的build.gradle中查看签名的配置信息。

image.png

登录AGC,进入“用户与访问”-“证书管理”,点击新增证书,上传前面生成的.csr文件,类型选择调试证书

完成签名配置后即可点击安装应用到调试设备。

功能实现

手机验证登录布局设计

image.png

参考如上布局,四个文本框输入分别输入国家码、手机号、密码、验证码,点击验证后收到验证码短信,输入验证码,点击登录,完成注册和登录布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent">

    <TextField
        ohos:id="$+id:countryCode"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="Your countryCode"
        ohos:text_input_type="pattern_number"
        ohos:text_size="50"
        ohos:top_margin="10vp"
        />

    <TextField
        ohos:id="$+id:phoneNumber"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="Your phone"
        ohos:text_input_type="pattern_number"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <TextField
        ohos:id="$+id:password"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="Password"
        ohos:text_input_type="pattern_password"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <TextField
        ohos:id="$+id:verifyCode"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="verifyCode"
        ohos:text_input_type="pattern_number"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <DirectionalLayout
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:orientation="horizontal">
        <Button
            ohos:id="$+id:Verify"
            ohos:height="match_content"
            ohos:width="100vp"
            ohos:background_element="$graphic:background_ability_main"
            ohos:left_margin="15vp"
            ohos:text="Verify"
            ohos:text_size="16fp"/>

        <Button
            ohos:id="$+id:Login"
            ohos:height="match_content"
            ohos:width="100vp"
            ohos:background_element="$graphic:background_ability_main"
            ohos:left_margin="15vp"
            ohos:text="Login"
            ohos:text_size="16fp"/>
    </DirectionalLayout>

</DirectionalLayout>

验证和登录:

输入国家码、手机号、后点击Verify,返回验证码发送成功日志,手机收到验证码,输入密码和验证码后点击Login返回登录成功日志:

image.png

页面跳转到登录成功页面:

image.png

验证和登录代码如下:

private void verify() {
    String countryCode = getCountryCode();
    String phoneNumber = getPhoneNumber();

    int action = VerifyCodeSettings.ACTION_REGISTER_LOGIN;
    VerifyCodeSettings settings = VerifyCodeSettings.newBuilder()
            .action(action)
            .sendInterval(30)
            .build();

    HarmonyTask<VerifyCodeResult> task = AGConnectAuth.getInstance()
            .requestVerifyCode(countryCode, phoneNumber, settings);

    task.addOnSuccessListener(TaskExecutors.uiThread(), new OnSuccessListener<VerifyCodeResult>() {
        @Override
        public void onSuccess(VerifyCodeResult verifyCodeResult) {
            log("verifyPhoneCode success");
        }
    }).addOnFailureListener(TaskExecutors.uiThread(), new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            log("verifyPhoneCode fail:" + e);
        }
    });

}

private void login() {
    String countryCode = getCountryCode();
    String phoneNumber = getPhoneNumber();
    String password = getPassword();
    String verifyCode = getVerify();

    AGConnectAuthCredential phoneAuthCredential =
            PhoneAuthProvider.credentialWithVerifyCode(countryCode, phoneNumber, password, verifyCode);

    /* signIn */
    HarmonyTask<SignInResult> task = AGConnectAuth.getInstance().signIn(phoneAuthCredential);
    task.addOnSuccessListener(new OnSuccessListener<SignInResult>() {
        @Override
        public void onSuccess(SignInResult signInResult) {
            log("signIn success");
            showUser(signInResult.getUser());
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            log("signInWithCode fail:" + e);
        }
    });
}

2、邮箱验证登录布局设计

image.png

参考如上布局,三个文本框输入分别输入邮箱号、密码、验证码,点击验证后收到验证码短信,输入验证码,点击登录,完成注册和登录,布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent">
    
    <TextField
        ohos:id="$+id:phoneNumber"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="Your phone"
        ohos:text_input_type="pattern_number"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <TextField
        ohos:id="$+id:password"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="Password"
        ohos:text_input_type="pattern_password"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <TextField
        ohos:id="$+id:verifyCode"
        ohos:height="match_content"
        ohos:width="150vp"
        ohos:hint="verifyCode"
        ohos:text_input_type="pattern_number"
        ohos:text_size="50"
        ohos:bottom_margin="10vp"
        />

    <DirectionalLayout
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:orientation="horizontal">
        <Button
            ohos:id="$+id:Verify"
            ohos:height="match_content"
            ohos:width="100vp"
            ohos:background_element="$graphic:background_ability_main"
            ohos:left_margin="15vp"
            ohos:text="Verify"
            ohos:text_size="16fp"/>

        <Button
            ohos:id="$+id:Login"
            ohos:height="match_content"
            ohos:width="100vp"
            ohos:background_element="$graphic:background_ability_main"
            ohos:left_margin="15vp"
            ohos:text="Login"
            ohos:text_size="16fp"/>
    </DirectionalLayout>

</DirectionalLayout>

输入邮箱号后点击Verify,返回验证码发送成功日志,邮箱收到验证码,输入密码和验证码后点击Login返回登录成功日志:

image.png

页面跳转到登录成功页面:

image.png

邮箱验证和登录代码如下:

private void verify() {
    //String countryCode = getCountryCode();
    String emailStr = getEmailStr();

    int action = VerifyCodeSettings.ACTION_REGISTER_LOGIN;
    VerifyCodeSettings settings = VerifyCodeSettings.newBuilder()
            .action(action)
            .sendInterval(30)
            .build();

    HarmonyTask<VerifyCodeResult> task = AGConnectAuth.getInstance()
            .requestVerifyCode(emailStr, settings);

    task.addOnSuccessListener(TaskExecutors.uiThread(), new OnSuccessListener<VerifyCodeResult>() {
        @Override
        public void onSuccess(VerifyCodeResult verifyCodeResult) {
            log("verifyEmailCode success");
        }
    }).addOnFailureListener(TaskExecutors.uiThread(), new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            log("verifyEmailCode fail:" + e);
        }
    });

}

private void login() {
    //String countryCode = getCountryCode();
    String emailStr = getEmailStr();
    String password = getPassword();
    String verifyCode = getVerify();

    AGConnectAuthCredential emailAuthCredential =
            EmailAuthProvider.credentialWithVerifyCode(emailStr, password, verifyCode);

    /* signIn */
    HarmonyTask<SignInResult> task = AGConnectAuth.getInstance().signIn(emailAuthCredential);
    task.addOnSuccessListener(new OnSuccessListener<SignInResult>() {
        @Override
        public void onSuccess(SignInResult signInResult) {
            log("signIn success");
            showUser(signInResult.getUser());
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            log("signInWithCode fail:" + e);
        }
    });
}

功能测试

在登陆成功后,打开AGC验证服务,在后台查询数据:

使用手机和邮箱注册的用户在后台均有显示账号信息和验证次数,验证次数与请求验证次数相同;

image.png

image.png

在AGC上删除账户,再次使用相同用户名和密码登录会报用户名或密码错误

image.png

在停用账户后登录会报账户已禁用错误。

image.png

欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh
 

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4478396/blog/5549942