HarmonyOS Next系列之华为账号一键登录功能实现(十四)

系列文章目录

HarmonyOS Next 系列之省市区弹窗选择器实现(一)
HarmonyOS Next 系列之验证码输入组件实现(二)
HarmonyOS Next 系列之底部标签栏TabBar实现(三)
HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)
HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)
HarmonyOS Next 系列之可移动悬浮按钮实现(六)
HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)
HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)
HarmonyOS Next系列之地图组件(Map Kit)使用(九)
HarmonyOS Next系列之半圆环进度条实现(十)
HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)
HarmonyOS Next系列之实现一个左右露出中间大两边小带缩放动画的轮播图(十二)
HarmonyOS Next系列之水波纹动画特效实现(十三)
HarmonyOS Next系列之华为账号一键登录功能实现(十四)


系列文章目录2

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)
【鸿蒙】HarmonyOS Next 组件或页面之间的所有通信(传参)方法总结


文章目录

  • 系列文章目录
  • 系列文章目录2
  • 前言
  • 一、开发前准备
    • 1、配置Client ID
    • 2、配置scope权限
  • 二、功能约束
  • 三、页面设计规范
  • 四、组件和API讲解
    • 1、一键登录按钮组件LoginWithHuaweiIDButton
    • 2、修改用户协议状态
    • 3、获取用户匿名手机号
    • 4、一键登录错误回调处理
  • 五、完整代码


前言

华为账号一键登录是指使用华为账号进行快捷登录的功能。通过一键登录,用户可以通过华为账号直接登录到指定的应用,无需输入繁琐的账号和密码。一键登录可以提供更便捷、快速、安全的登录方式,减少用户的登录烦恼和输入错误。 本文将以代码示例讲解鸿蒙next华为账号一键登录客户端实现过程和页面设计规范。

请添加图片描述


一、开发前准备

1、配置Client ID

登录AppGallery Connect平台,获取在“项目设置 > 常规 > 应用”区域获取“OAuth 2.0客户端ID(凭据)”处的Client ID。

在这里插入图片描述

在工程中entry模块的module.json5文件中,新增metadata,配置name为client_id,value为上一步获取的Client ID的值

在这里插入图片描述

2、配置scope权限

篇幅较长直接看官方教程 开启华为账号服务权限教程

二、功能约束

(1)华为账号一键登录服务当前仅限中国大陆用户可用。
(2)后端服务器必须部署在中国大陆境内。
(3)用户必须同意《华为账号用户认证协议》方可登录,同时可查看协议详细说明。

《华为账号用户认证协议》链接:https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN
系统深色模式下跳转到:
https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN&bgmode=black。

三、页面设计规范

页面设计不规范将影响审核通过,尽量按官方要求来设计

在这里插入图片描述

 页面设计可以参考上图官方示例

登录页:
(1)首次登录必须要显示用户匿名手机号
(1)首次登录必须要显示“华为账号绑定号码”固定文字
(2)必须要显示《华为账号用户认证协议》,点击可以跳到内页查看协议详情。
(3)必须要显示华为账号一键登录按钮
(4)可选择显示应用logo或头像
(5)可选择显示其他登录方式入口
(6)可选择增加显示其他协议,比如用户协议、隐私协议等

在这里插入图片描述

四、组件和API讲解

客户端实现一键登录的核心提炼就是通过点击一键登录按钮将回调获取的Authorization Code数据传给服务器(后端)即可。
服务器通过调用获取用户级凭证接口和获取用户信息接口获取用户完整手机号和UnionID、OpenID完成用户关联

1、一键登录按钮组件LoginWithHuaweiIDButton

引用方式:

import { LoginWithHuaweiIDButton, loginComponentManager } from '@kit.AccountKit';

参数:
在这里插入图片描述
说明:
params为组件参数可以对组件样式进行设置,参考params官方文档
controller为控制器,可以设置用户协议状态(setAgreementStatus)、一键登录结果事件回调(onClickLoginWithHuaweiIDButton)等操作,参考controller官方文档

示例:

import { loginComponentManager, LoginWithHuaweiIDButton } from '@kit.AccountKit'
@Entry
@Component
struct  Demo{
// 构造LoginWithHuaweiIDButton组件的控制器controller: loginComponentManager.LoginWithHuaweiIDButtonController =new loginComponentManager.LoginWithHuaweiIDButtonController()/*** 当应用使用自定义的登录页时,如果用户未同意协议,需要设置协议状态为NOT_ACCEPTED,当用户同意协议后再设置* 协议状态为ACCEPTED,才可以使用华为账号一键登录功能*/.setAgreementStatus(loginComponentManager.AgreementStatus.NOT_ACCEPTED)//执行一键登录回调.onClickLoginWithHuaweiIDButton((error: BusinessError, response: loginComponentManager.HuaweiIDCredential) => {if (error) {this.dealAllError(error);return;}if (response) {// 获取到Authorization Codeconst authorizationCode = response.authorizationCode;//底下逻辑把code通过接口发送个后端实现登录}})// 错误处理dealAllError(error: BusinessError): void {}build() {//一键登录按钮LoginWithHuaweiIDButton({controller: this.controller})}
}

2、修改用户协议状态

用户协议状态必须设置已同意《华为账号用户认证协议》才能正常执行一键登录功能,否则返回错误信息,可通过controller.setAgreementStatus(status:AgreementStatus) 设置,实际开发中初始化控制器默认设置未同意状态,等待用户勾选后再改变为已同意。

AgreementStatus枚举值
在这里插入图片描述

import { loginComponentManager} from '@kit.AccountKit'
//已同意
controller.setAgreementStatus(loginComponentManager.AgreementStatus.ACCEPTED)
//未同意
controller.setAgreementStatus(loginComponentManager.AgreementStatus.NOT_ACCEPTED)

3、获取用户匿名手机号

 async getAnonymousPhone() {//匿名手机号let anonymousPhone: string = ''// 创建授权请求,并设置参数const authRequest = new authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest();// 获取匿名手机号需传quickLoginAnonymousPhone这个scope,传参之前需要先申请“华为账号一键登录”权限authRequest.scopes = ['quickLoginAnonymousPhone'];// 用于防跨站点请求伪造authRequest.state = util.generateRandomUUID();// 一键登录场景该参数必须设置为falseauthRequest.forceAuthorization = false;const controller = new authentication.AuthenticationController();try {let response: authentication.AuthorizationWithHuaweiIDResponse = await controller.executeRequest(authRequest)anonymousPhone = response.data?.extraInfo?.quickLoginAnonymousPhone as string;} catch (error) {}return anonymousPhone}

4、一键登录错误回调处理

错误回调是BusinessError类型,错误码枚举值定义如下:

enum ErrorCode {// 账号未登录ERROR_CODE_LOGIN_OUT = 1001502001,// 该账号不支持一键登录,如儿童账号、海外账号ERROR_CODE_NOT_SUPPORTED = 1001500003,// 网络错误ERROR_CODE_NETWORK_ERROR = 1001502005,// 用户未同意用户协议ERROR_CODE_AGREEMENT_STATUS_NOT_ACCEPTED = 1005300001,// 参数错误ERROR_CODE_PARAMETER_ERROR = 401
}

处理逻辑

// 错误处理dealAllError(error: BusinessError): void {if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) {AlertDialog.show({message: "网络未连接,请检查网络设置。",offset: { dx: 0, dy: -12 },alignment: DialogAlignment.Bottom,autoCancel: false,confirm: {value: "知道了",action: () => {}}});} else if (error.code === ErrorCode.ERROR_CODE_AGREEMENT_STATUS_NOT_ACCEPTED) {// 未同意协议this.showToast("请阅读并同意协议");} else if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {// 华为账号未登录提示this.showToast("华为账号未登录,请先登录");} else if (error.code === ErrorCode.ERROR_CODE_NOT_SUPPORTED) {// 不支持该scopes或permissions提示this.showToast("该scopes或permissions不支持");} else if (error.code === ErrorCode.ERROR_CODE_PARAMETER_ERROR) {// 参数错误提示this.showToast("参数错误");} else {// 其他提示系统或服务异常this.showToast('服务或网络异常,请稍后重试');}}// Toast提示showToast(resource: string) {try {promptAction.showToast({message: resource,duration: 2000});} catch (error) {}}

五、完整代码

实现如下图所示效果:

请添加图片描述
请添加图片描述

QuickLoginDemo.ets(登录页)

import { authentication, loginComponentManager, LoginWithHuaweiIDButton } from '@kit.AccountKit'
import { promptAction, router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { util } from '@kit.ArkTS';@Entry
@Component
struct QuickLoginDemo {//是否同意隐私协议@State isAgree: boolean = false//匿名手机号@State phone: string = ''// 构造LoginWithHuaweiIDButton组件的控制器controller: loginComponentManager.LoginWithHuaweiIDButtonController =new loginComponentManager.LoginWithHuaweiIDButtonController()/*** 当应用使用自定义的登录页时,如果用户未同意协议,需要设置协议状态为NOT_ACCEPTED,当用户同意协议后再设置* 协议状态为ACCEPTED,才可以使用华为账号一键登录功能*/.setAgreementStatus(loginComponentManager.AgreementStatus.NOT_ACCEPTED).onClickLoginWithHuaweiIDButton((error: BusinessError, response: loginComponentManager.HuaweiIDCredential) => {if (error) {this.dealAllError(error);return;}if (response) {// 获取到Authorization Codeconst authorizationCode = response.authorizationCode;console.log(authorizationCode.toString(),'code')//底下写接口请求登录逻辑,code传给服务器//模拟接口setTimeout(()=>{this.showToast('登录成功!')},2000)}});// 错误处理dealAllError(error: BusinessError): void {if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) {AlertDialog.show({message: "网络未连接,请检查网络设置。",offset: { dx: 0, dy: -12 },alignment: DialogAlignment.Bottom,autoCancel: false,confirm: {value: "知道了",action: () => {}}});} else if (error.code === ErrorCode.ERROR_CODE_AGREEMENT_STATUS_NOT_ACCEPTED) {// 未同意协议this.showToast("请阅读并同意协议");} else if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {// 华为账号未登录提示this.showToast("华为账号未登录,请先登录");} else if (error.code === ErrorCode.ERROR_CODE_NOT_SUPPORTED) {// 不支持该scopes或permissions提示this.showToast("该scopes或permissions不支持");} else if (error.code === ErrorCode.ERROR_CODE_PARAMETER_ERROR) {// 参数错误提示this.showToast("参数错误");} else {// 其他提示系统或服务异常this.showToast('服务或网络异常,请稍后重试');}}// Toast提示showToast(resource: string) {try {promptAction.showToast({message: resource,duration: 2000});} catch (error) {}}//获取匿名手机号async getAnonymousPhone() {//匿名手机号let anonymousPhone: string = ''// 创建授权请求,并设置参数const authRequest = new authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest();// 获取匿名手机号需传quickLoginAnonymousPhone这个scope,传参之前需要先申请“华为账号一键登录”权限authRequest.scopes = ['quickLoginAnonymousPhone'];// 用于防跨站点请求伪造authRequest.state = util.generateRandomUUID();// 一键登录场景该参数必须设置为falseauthRequest.forceAuthorization = false;const controller = new authentication.AuthenticationController();try {let response: authentication.AuthorizationWithHuaweiIDResponse = await controller.executeRequest(authRequest)anonymousPhone = response.data?.extraInfo?.quickLoginAnonymousPhone as string;} catch (error) {}return anonymousPhone}//初始化async aboutToAppear() {//获取匿名手机号this.phone = await this.getAnonymousPhone()}build() {Navigation() {Column() {// logoImage($r('app.media.logo')).width(100).height(100).borderRadius(20).margin({ top: 80 })// 匿名手机号Text(this.phone).fontSize(40).margin({ top: 60 })Text('华为账号绑定号码').fontSize(13).fontColor('#999').margin({ top: 10 })Column() {//一键登录按钮LoginWithHuaweiIDButton({params: {// LoginWithHuaweiIDButton支持的样式style: loginComponentManager.Style.BUTTON_RED,// 账号登录按钮在登录过程中展示加载态extraStyle: {buttonStyle: new loginComponentManager.ButtonStyle().loadingStyle({show: true})},// LoginWithHuaweiIDButton的边框圆角半径borderRadius: 24,// LoginWithHuaweiIDButton支持的登录类型loginType: loginComponentManager.LoginType.QUICK_LOGIN,customButtonParams: {backgroundColor: 'rgba(255,255,255,0.6)'},// LoginWithHuaweiIDButton支持按钮的样式跟随系统深浅色模式切换supportDarkMode: true,// verifyPhoneNumber:如果华为账号用户在过去90天内未进行短信验证,是否拉起Account Kit提供的短信验证码页面verifyPhoneNumber: true},controller: this.controller}).width('100%').height(48)//其他登录按钮Button('其他方式登录').margin({ top: 16 }).height(48).width('100%').backgroundColor('#F2F2F2').fontColor('#000')}.margin({ top: 50 })Blank()//隐私协议Row() {//勾选框Column() {if (this.isAgree) {Image($r('app.media.checked')).width(18)} else {Circle({ width: 18, height: 18 }).stroke('#999').fill('rgba(0,0,0,0)')}}.onClick(() => {this.isAgree = !this.isAgree//设置协议状态this.controller.setAgreementStatus(this.isAgree ? loginComponentManager.AgreementStatus.ACCEPTED :loginComponentManager.AgreementStatus.NOT_ACCEPTED);})//协议文字Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Start,wrap: FlexWrap.Wrap}) {Text('已阅读并同意').custText('#999')Text('《xxxx用户协议》').custText('#000')Text('《xxxx用户协议》').custText('#000')Text('和').custText('#999')Text('《华为账号用户认证协议》').custText('#000').onClick(()=>{router.pushUrl({url:'pages/agreement'})})}.margin({ left: 8 })}.width('100%').padding({ left: 10 })}.padding(20).height('100%')}.hideTitleBar(true).hideToolBar(true).height('100%').width('100%')}
}@Extend(Text)
function custText(fontColor: ResourceColor) {.fontSize(12).fontColor(fontColor).lineHeight(18)
}enum ErrorCode {// 账号未登录ERROR_CODE_LOGIN_OUT = 1001502001,// 该账号不支持一键登录,如儿童账号、海外账号ERROR_CODE_NOT_SUPPORTED = 1001500003,// 网络错误ERROR_CODE_NETWORK_ERROR = 1001502005,// 用户未同意用户协议ERROR_CODE_AGREEMENT_STATUS_NOT_ACCEPTED = 1005300001,// 参数错误ERROR_CODE_PARAMETER_ERROR = 401
}

Agreement.ets(华为账号用户认证协议页)

/*** 华为账号用户认证协议页*/
import { webview } from '@kit.ArkWeb';@Entry
@Component
struct Agreement {@State webUrl: string = 'https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN'private controller: webview.WebviewController = new webview.WebviewController()build() {Navigation() {Web({ src: this.webUrl, controller: this.controller }).zoomAccess(false).height('100%').width('100%')}.title('华为账号用户认证协议').titleMode(NavigationTitleMode.Mini)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据架构设计:数据分层治理的全景指南

大数据架构设计:数据分层治理的全景指南 在大数据架构中,数据分层治理是一种被广泛采用的设计模式,其核心目的是为数据赋予结构化管理的能力,降低复杂度,并为数据的多样化使用场景提供保障。在这篇文章中,…

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等

目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔,是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名,要求更严…

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…

如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]

无论您是在上在线课程还是参加在线会议,您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里,本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索! …

Python 中几个库的安装与测试

一、jupyter 安装步骤 确保系统已经安装了Python(建议 Python 3.6 及以上版本)。点击WinR输入cdm进入命令提示符窗口,然后输入pip install jupyter,按下回车键。等待安装过程完成。安装过程中,你会看到命令行输出安装…

【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现

图像缩放技术在图像显示、传输、分析等多个领域中扮演着重要角色。随着数字图像处理技术的发展,对图像缩放质量的要求也越来越高。二阶牛顿插值因其在处理图像时能够较好地保持边缘特征和减少细节模糊,成为了图像缩放中的一个研究热点。 一、 二阶牛顿插…

5.1 数据库:INSERT 插入语句

工作中增删改查这四类sql语句里边用的最多的就是查询语句。因为绝大多数的软件系统都是读多写少的,而且查询的条件也是各种各样。本节课程我们来学习下一个DML语句,那就是向数据表里面写入记录的insert语句。Insert语句是可以向数据表里边写入&#xff0…

【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷

一.填空题(每空2分,共30分) 1.算法的时间复杂性指算法中 元运算 的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中, O 提供了算法运行时间的一个上界。 3.设Dn…

嵌入式技术之Linux(Ubuntu) 一

一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器,获得数据后,需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据,那么这个上位机是什么机器? 我们的笔记本电脑就可以当成上位机。 两个手…

Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之:如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念,强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理,这里有…

浙江安吉成新的分布式光伏发电项目应用

摘 要:分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上,利用太阳能进行发电的一种可再生能源利用方式,与传统的大型集中式光伏电站相比,分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”,经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

基于phpstudy快速搭建本地php环境(Windows)

好好生活,别睡太晚,别爱太满,别想太多。 声明 仅作为个人学习使用,仅供参考 对于CTF-Web手而言,本地PHP环境必不可少,但对于新手来说从下载PHP安装包到配置PHP环境是个非常繁琐的事情,因此笔者…

后台管理系统引导功能的实现

引导是软件中经常见到的一个功能,无论是在后台项目还是前台或者是移动端项目中。 那么对于引导页而言,它是如何实现的呢?通常情况下引导页是通过 聚焦 的方式,高亮一块视图,然后通过文字解释的形式来告知用户该功能的作…

vscode通过ssh连接服务器实现免密登录

一、通过ssh连接服务器 1、打开vscode,进入拓展(CtrlShiftX),下载拓展Remote - SSH。 2、点击远程资源管理器选项卡,选择远程(隧道/SSH)类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件;图示如下: 但是,下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…

分享:osgb倾斜数据转cesium-3dtiles 小工具.

背景: 很多知识殊途同归,在三维软件这块,少不了要和各种各样的数据格式打交道.osgb,stl,obj,3dtiles,3ds等等..虽然里面本质核心基本都是几何数据拓扑数据材质纹理数据等等,但是由于其组织方式不同和特殊的应用场景,导致很多模型需要转来转去...相信很多人在这方面都或多或少吃…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

25年01月HarmonyOS应用基础认证最新题库

判断题 “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。为了实现这一目的,HarmonyOS提供了多端开发环境,多端开发能力以及多端分发机制。 答案:正确 《鸿蒙生态应用开发白皮书》全面阐释…