【HarmonyOS】云开发-用户自动认证

news2024/9/20 22:46:38

背景


华为云服务提供了统一认证的云服务,支持手机、邮箱等自定义登录服务,并且提供了免费使用的额度,这样子方便中小企业或者项目快速的开发工作。下面是支持的认证方式:

操作步骤

1.AGC(AppGallery Connect)创建项目

在AGC界面创建自己的云服务项目(详细可看上篇文章【HarmonyOS】端云一体化初始化项目),并开通认证服务,如下图:

启用手机号码和邮箱地址服务:

2.添加项目配置文件

在AGC的项目界面下载agconnect-services.json文件,并添加到本地的项目文件中。

3.添加与云服务相关的第三方库

  • 在项目的终端中,输入 cd entry 进入entry目录
  • 安装SDK
ohpm install @hw-agconnect/hmcore
ohpm install @hw-agconnect/cloud

可以在entry->oh-package.json5文件中可以查看添加的第三方库和对应的版本号,可以看到添加了 @hw-agconnect/hmcore和 @hw-agconnect/cloud两个第三方库。

示例使用手机验证码实现登录功能

验证码的操作示意图

1.搭建初始化界面

import { router } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  //手机号码
  @State TelNumber: string = "";
  //验证码
  @State VerifyNumber: string = "";

  build() {
    Column() {
      TextInput({ placeholder: "请输入手机号" })
        .width("80%")
        .type(InputType.PhoneNumber)
        .height(50)
        .onChange(value => {
          this.TelNumber = value;
        })
      Row() {
        TextInput({ placeholder: "请输入验证码" })
          .width("50%")
          .type(InputType.Number)
          .height(50)
          .onChange(value => {
            this.VerifyNumber = value;
          })
        Button("获取验证码")
          .fontSize(14)
          .layoutWeight(1)
          .margin({ left: 20 })
          .height(50)
      }
      .width("80%")
      .margin({ top: 20, bottom: 20 })

      Button("登录").onClick((event: ClickEvent) => {
        
      })
        .width("80%")
    }
    .height('100%')
    .width('100%')
    .padding(10)
    .backgroundColor($r('app.color.start_window_background'))
    .alignItems(HorizontalAlign.Center)
  }
}

2.云服务认证使用初始化

修改EntryAbility文件代码进行初始化

  • 添加import { initialize } from ‘@hw-agconnect/hmcore’
  • 添加配置的JSON文件路径 :import serciceJson from ‘…/…/resources/rawfile/agconnect-services.json’
  • 在OnCreate方法中添加初始化代码

修改示意图:

整体代码如下:

import { abilityAccessCtrl, AbilityConstant, PermissionRequestResult, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { initialize } from '@hw-agconnect/hmcore'
import serciceJson from '../../resources/rawfile/agconnect-services.json'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    try {
      initialize(this.context, serciceJson);
    } catch (e) {
      hilog.error(0x0000, 'AGConnectError', JSON.stringify(e));
    }
    let AtManager = abilityAccessCtrl.createAtManager();
    AtManager.requestPermissionsFromUser(this.context, ['ohos.permission.READ_MEDIA', 'ohos.permission.MEDIA_LOCATION'])
      .then((data: PermissionRequestResult) => {
        hilog.info(0x0000, 'testTag', '%{public}s', 'request permissions from user success' + data);
      })
      .catch((err: Object) => {
        hilog.error(0x0000, 'testTag', 'Failed to request permissions from user. Cause: %{public}s',
          JSON.stringify(err) ?? '');
      });
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

发送验证码

输入手机号码后点击获取验证码按钮,然后获取登录的验证码短信。短信截图如下:

完整代码:

import { router } from '@kit.ArkUI';
import cloud from '@hw-agconnect/cloud'
import { Auth, VerifyCodeAction } from '@hw-agconnect/cloud';
import hilog from '@ohos.hilog';
import json from '@ohos.util.json';
import { JSON } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  //手机号码
  @State TelNumber: string = "";
  //验证码
  @State VerifyNumber: string = "";

  build() {
    Column() {
      TextInput({ placeholder: "请输入手机号" })
        .width("80%")
        .type(InputType.PhoneNumber)
        .height(50)
        .onChange(value => {
          this.TelNumber = value;
        })
      Row() {
        TextInput({ placeholder: "请输入验证码" })
          .width("50%")
          .type(InputType.Number)
          .height(50)
          .onChange(value => {
            this.VerifyNumber = value;
          })
        Button("获取验证码")
          .fontSize(14)
          .layoutWeight(1)
          .margin({ left: 20 })
          .height(50)
          .onClick(async () => {
            try {
              await cloud.auth().requestVerifyCode({
                verifyCodeType: {
                  kind: "phone",
                  phoneNumber: this.TelNumber,
                  countryCode: "86"
                },
                action: VerifyCodeAction.REGISTER_LOGIN,
                lang: "zh_CN",
                sendInterval: 60
              })
              hilog.error(0, 'VerifyCode', "Success");
            } catch (e) {
              AlertDialog.show({ title: "错误", message: "验证码发送失败" })
              hilog.error(0, 'VerifyCode', JSON.stringify(e));
            }
          })
      }
      .width("80%")
      .margin({ top: 20, bottom: 20 })

      Button("登录").onClick((event: ClickEvent) => {

      })
        .width("80%")
    }
    .height('100%')
    .width('100%')
    .padding(10)
    .backgroundColor($r('app.color.start_window_background'))
    .alignItems(HorizontalAlign.Center)
  }
}

主要调用requestVerifyCode方法去获取验证码信息,传入VerifyCodeParam类型对象。

VerifyCodeParam的属性解析:

  • verifyCodeType :PhoneVerifyCode对象,主要输入phoneNumber和countryCode对象。
  • action : 枚举值,选择获取验证码的类型
  • lang : 语言
  • sendInterval : 重复发送的时间间隔

根据验证码实现登录功能

实现登录效果

import { router } from '@kit.ArkUI';
import cloud from '@hw-agconnect/cloud'
import { Auth, VerifyCodeAction } from '@hw-agconnect/cloud';
import hilog from '@ohos.hilog';
import json from '@ohos.util.json';
import { JSON } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  //手机号码
  @State TelNumber: string = "";
  //验证码
  @State VerifyNumber: string = "";

  build() {
    Column() {
      TextInput({ placeholder: "请输入手机号" })
        .width("80%")
        .type(InputType.PhoneNumber)
        .height(50)
        .onChange(value => {
          this.TelNumber = value;
        })
      Row() {
        TextInput({ placeholder: "请输入验证码" })
          .width("50%")
          .type(InputType.Number)
          .height(50)
          .onChange(value => {
            this.VerifyNumber = value;
          })
        Button("获取验证码")
          .fontSize(14)
          .layoutWeight(1)
          .margin({ left: 20 })
          .height(50)
          .onClick(async () => {
            try {
              await cloud.auth().requestVerifyCode({
                verifyCodeType: {
                  kind: "phone",
                  phoneNumber: this.TelNumber,
                  countryCode: "86"
                },
                action: VerifyCodeAction.REGISTER_LOGIN,
                lang: "zh_CN",
                sendInterval: 60
              })
              hilog.error(0, 'VerifyCode', "Success");
            } catch (e) {
              AlertDialog.show({ title: "错误", message: "验证码发送失败" })
              hilog.error(0, 'VerifyCode', JSON.stringify(e));
            }
          })
      }
      .width("80%")
      .margin({ top: 20, bottom: 20 })

      Button("登录").onClick(async (event: ClickEvent) => {
        try {
          const result = await cloud.auth().signIn({
            credentialInfo: {
              kind: "phone",
              countryCode: "86",
              phoneNumber: this.TelNumber,
              verifyCode: this.VerifyNumber
            }
          })
          AlertDialog.show({ title: "登录", message: "登录成功!!!" })
        } catch (e) {
          AlertDialog.show({ title: "错误", message: "登录失败" })
          hilog.error(0, 'Login', JSON.stringify(e));
        }
      })
        .width("80%")
    }
    .height('100%')
    .width('100%')
    .padding(10)
    .backgroundColor($r('app.color.start_window_background'))
    .alignItems(HorizontalAlign.Center)
  }
}

主要调用auth的signIn方法,并传入对应的电话号码和验证码。
SignInParam对象

  • credentialInfo: CredentialInfo对象,设置电话号码和前缀,可以选择密码登录或者验证码登录
  • autoCreateUser?: boolean; 设置当没有当前对象存在时,是否需要自动生成用户。

总结

以上示例仅仅对统一认证流程的讲解,其中完整的逻辑判断并没有添加,可以根据自己的需求来添加相应的逻辑判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第342题4的幂

题目: 题解: class Solution { public:bool isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) 0 && n % 3 1;} };

zabbix监控进程、日志、主从状态和主从延迟

zabbix监控进程、日志、主从状态和主从延迟 监控进程1、下载服务2、编写脚本3、编写zabbix_agentd.conf4、新建监控项配置触发器5、查看邮件 监控日志1、上传log.py的2、编写zabbix_agentd.conf3、新建监控项配置触发器 监控数据库主从状态1、编写/etc/hosts(master…

IOS 09 R.swift框架和使用方法

R.swift框架主要是实现通过类字段访问字符串,图片,等资源;类似Android那边通过R类访问,好处是有提示,如果缺少资源,直接就是编译错误;OC类似的功能叫R.objc。 添加依赖 添加依赖 #将资源&…

第八周:机器学习笔记

第八周机器学习笔记 摘要Abstract机器学习1. 鱼和熊掌和可兼得的机器学习1.1 Deep network v.s. Fat network 2. 为什么用来验证集结果还是不好? Pytorch学习1. 卷积层代码实战2. 最大池化层代码实战3. 非线性激活层代码实战 总结 摘要 本周学习对李宏毅机器学习视…

AI学习记录 - Word2Vec 超详细解析

创作不易,点个赞 我们有一堆文本,词汇拆分 sentences ["jack like dog", "jack like cat", "jack like animal","dog cat animal", "banana apple cat dog like", "dog fish milk like"…

URP平面阴影合批处理 shadow

闲谈 相信大家在日常工作中发现了一个问题 , urp下虽然可以做到3个Pass 去写我们想要的效果,但是,不能合批(不能合批,那不是我们CPU要干冒烟~!) 好家伙,熊猫老师的偏方来了 &#x…

【数值方法-Python实现】Crout分解+追赶法实现

涉及Crout分解、追赶法的线性方程组求解方法的Python实现。 原文链接:https://www.cnblogs.com/aksoam/p/18366119 Codes def CroutLU(A:np.ndarray)->Tuple[np.ndarray,np.ndarray]:"""Crout LU分解算法,ALUinput:A: (n,n) np.ndarray,方阵out…

DrissionPage自动化获取城市数据内容

一、获取页面内容 二、最终结果 上海市 约收录140个指标 查看98075次 人均GDP 153299元 公交车 17899辆 户籍人口 1469.3万人 三、代码 from DrissionPage._pages.chromium_page import ChromiumPage import time page ChromiumPage() page.get(https://www.swguancha.com/…

【Delphi】中多显示器操作基本知识点

提要: 目前随着计算机的发展,4K显示器已经逐步在普及,笔记本的显示器分辨率也都已经超过2K,多显示器更是普及速度很快。本文介绍下Delphi中操作多显示器的基本知识点(Windows系统),这些知识点在…

UniFab 是一款由人工智慧驅動的視訊增強器+ crack

UniFab 是一款功能强大的视频处理工具,包括 10 个基于 AI 的功能。使用 UniFab,您可以提高视频和音频质量、将视频转换为不同的格式、根据自己的喜好编辑视频等等。以下是适用于 Windows 的 UniFab 程序的简要说明: 视频转换器。UniFab 支持 1000 多种视频格式的转换,包括 …

构建自己的图数据集

代码: import warnings warnings.filterwarnings("ignore") import torch from torch_geometric.data import Datax torch.tensor([[2,1],[5,6],[3,7],[12,0]],dtypetorch.float) y torch.tensor([0,1,0,1],dtypetorch.float)#定义边 edge_index torc…

⌈ 传知代码 ⌋ DETR[端到端目标检测]

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Leetcode3232. 判断是否可以赢得数字游戏

Every day a Leetcode 题目来源:3232. 判断是否可以赢得数字游戏 解法1:3232. 判断是否可以赢得数字游戏 用一个 sum1 统计个位数的和,sum2 统计十位数的和。 只要 sum1 和 sum2 不相等,Alice 拿大的就能赢得这场游戏。 代码…

【论文阅读】HuatuoGPT-II, One-stage Training for Medical Adaption of LLMs

总体概要 本文深入探讨了一款专为医疗领域设计的大规模语言模型——HuatuoGPT-II的创新、性能与应用。HuatuoGPT-II采用统一的单阶段训练流程,将传统的继续预训练和监督微调整合,有效解决了医疗数据的异质性问题,包括语言、体裁和格式差异&a…

【STM32单片机_(HAL库)】3-2-1【中断EXTI】【电动车报警器项目】继电器定时开闭

1.硬件 STM32单片机最小系统继电器模块 2.软件 继电器模块alarm驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "alarm.h"int main(void) {HAL_Init(); …

硬件面试经典 100 题(71~90 题)

71、请问下图电路的作用是什么? 该电路实现 IIC 信号的电平转换(3.3V 和 5V 电平转换),并且是双向通信的。 上下两路是一样的,只分析 SDA 一路: 1) 从左到右通信(SDA2 为输入状态&…

同一台电脑同时连接使用Gitee(码云)和Github

1、添加对应的密钥 ssh-keygen -t rsa -C "your_emailexample.com" -f ~/.ssh/github_id-rsa //生成github秘钥 ssh-keygen -t rsa -C "your_emailexample.com" -f ~/.ssh/gitee_id-rsa //生成码云秘钥 2、在 ~/.ssh 文件里会生成对应的文件 文件夹里会…

[k8s源码]12.远程调试dlv

在Windows/Mac宿主机上,使用GoLand的IDE进行开发,但是如何将这些代码直接运行在k8s集群中并看到运行效果呢,这里有一个远程调试工具dlv。 图中展示了dlv的工作方式。GoLand IDE中包含Editor(编辑器)和Debugger(调试器)组件,其中De…

深度学习基础之前馈神经网络

目录 基本结构和工作原理 神经元和权重 激活函数 深度前馈网络 应用场景 优缺点 深度前馈神经网络与卷积神经网络(CNN)和循环神经网络(RNN)的具体区别和联系是什么? 具体区别 联系 如何有效解决前馈神经网络…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光:pymodbus的奇妙之旅背景:为何选择pymodbus?pymodbus是什么?如何安装pymodbus?5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…