HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南

HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南

事件背景

近来看到开发者论坛举办了端云一体的比赛,想了个小项目提交。之前只用过云函数没用过云数据库,正好借此机会学习一下。没想到一开始就踩了坑,于是撰文记录一下。

image

项目情况

这次的项目是一个简单的手机数独题库,用户通过填写数独题目可以保存到自己的题库中,也可以从题库中删除题目,当然数据库是同一个,但是会有用户隔离的机制,每个用户只能访问自己的数据。

起初通过文档创建Profile调试证书,开通云数据库,创建objecttype,部署后在端侧代码中调用插入数据,显示权限不足,这个时候才终于知道了官方文档中还有很多细节没有提及。

image

官方手册链接如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cloudfoundation-database-add-object

官方手册中提及了两个比较重要的概念认证用户数据创建者搜索遍了整个文档都没有相关的解释,让很多开发者摸不着头脑,按照个人的理解,肯定是需要使用数据创建者这个权限,这样每个用户都只可以保存和删除自己的题目。

权限不足问题的摸索

由于遇到了权限不足的情况,正好端云一体化开发的章节中有一个FAQ的页面。

端云一体化开发FAQ链接如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/agc-harmonyos-clouddev-faq

FAQ中提及到如果遇到权限不足,需要把全区设置为可读写,或者参考AuthProvider相关章节,点击跳到AuthProvider后是cloudCommon模块的文档,里面有少量的示例代码,但是解释还是相当的含糊,仅提及了可以使用AGC的认证服务SDK或者使用华为账号服务Access Token接口自定义AuthProvider,这对于一个初次使用的人来说根本就像天书一样看不懂。

cloudCommon模块的文档如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/cloudfoundation-cloudcommon#section9723191765120

随后到处翻,在手册的getAccessToken章节,手册详细提到了可以使用AGC提供的认证服务SDK自动处理AccessToken,开发者并不需要理会具体实现,只要引入相关配置使用手机、邮箱或华为账号进行登录认证即可。这么重要的信息放在getAccessToken章节,感觉放的位置有点不对。点击登录认证字样后可以跳到AGC认证服务SDK的相关功能文档。

AGC认证服务SDK链接如下:

https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-auth-harmonyos-arkts12-login-0000001922217296

AGC认证服务SDK描述了可以通过不同的方式登录,最简单当然是通过华为账号登录,并提供了相关代码。但通常开发者看到这里很容易把Account Kit的华为账号登录和AGC认证服务的华为账号登录弄混,我印象中参加活动时候有老师说过这个AGC的SDK是很多平台都可以用的,所以云数据库大概了也是能够被其他平台使用,放在AGC的SDK里面比较合情合理,至此大概摸清了整个流程,开始撸码。

尝试配置AuthProvider

准备签名文件

准备几个东西,当然包括了csr文件,profile文件和调试证书,因为端云一体化需要手动配置签名,所以需要准备这些文件。

image

在AGC的后台打开认证服务,打开华为账号登录

根据提示,打开华为账号登录的时候要求输入ClientID和ClientSecret,这个在应用页面的OAuth栏位已经标明出来,可以直接复制到相应的输入框里。

image

下载json配置文件,同时复制ClientId备用

在项目的首页,找到下载点并记录ClientId

image

开始写代码

在DevEco配置AGC认证服务,加入package

image

把agc的json文件放置在AppScope的rawfile下面,并在module.json5中配置元数据,加入clientId信息

image

应用启动时加载SDK信息

EntryAbility.etsonCreate中加入以下代码,读取agc的json文件完成配置过程

let file = this.context.resourceManager.getRawFileContentSync('agconnect-services.json')
let json: string = buffer.from(file.buffer).toString()
auth.init(this.context, json)

在页面装载时配置端云一体验证方式

Index.etsonDidBuild中加入代码,页面装载时配置端云一体的认证方式,这里选择使用华为账号登录,注意这里如果用户已经静默登录过一次,是不需要再次登录的,再次登录反而报错

// 获取用户信息
let authUser = await auth.getCurrentUser()

if (!authUser) {
    // 如果用户未登录,执行静默登录
    let signInResult = await auth.signIn({
        autoCreateUser: true,
        "credentialInfo": {
            "kind": "hwid"  // 使用华为账号登录
        }
    })
    authUser = signInResult.getUser()
}

// 打印用户ID,这个在后面代码中用到
this.userId = authUser.getUid()
console.log("userID: " + this.userId)

// 执行端云kit的初始化,authProvider在这里传入
cloudCommon.init({
    region: cloudCommon.CloudRegion.CHINA,
    authProvider: auth.getAuthProvider(),
    functionOptions: { timeout: 10 * 1000 },
    storageOptions: { mode: request.agent.Mode.BACKGROUND, network: request.agent.Network.ANY },
    databaseOptions: { schema: "schema.json", traceId: "9527" }
})

重新执行数据插入

这个时候根据官方文档,在用户点击按钮的时候,调用端云的upsert函数就可以成功插入数据啦

let databaseZone = cloudDatabase.zone('default')
let question = new QuestionBank()
question.userId = this.userId || ""
question.question = question
question.time = new Date()
await databaseZone.upsert(question)

执行数据删除

因为已经成为了数据创建者,这时候我们调用端云的delete函数就可以成功删除数据啦

let databaseZone = cloudDatabase.zone('default')
let questionBank = new QuestionBank()
questionBank.id = this.questionList[this.currentQuestionIndex].id
await databaseZone.delete(questionBank)

总结

虽然这个项目只是一个简单的增删改查类操作,但是也让我对端云一体开发有了更深入的了解,由于官方开发指南中不同的API版本已经糅合在同一个页面中进行展示,可能老版本文档的代码会被新版本所遮盖,但新版本文档的代码又非常残缺,很多关键的核心知识都没有提及,这让我在开发过程中遇到了很多问题,也让我对端云一体开发有了更深入的了解。

在这文章中,我尝试复现了整个项目中最简单但却是最关键的步骤,描述了如何接入认证服务SDK,使端云一体的用户变成了数据创建者,这样每个用户都可以保存和删除自己的数据,完成了一个比较普遍的项目需求,希望这篇文章能够帮助到大家,让大家都能完成自己独特的作品,在鸿蒙花园里实现自己的梦想。


更多关于HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,《数拼拍拍》使用云数据库需配置以下权限:

  1. module.json5中添加ohos.permission.DISTRIBUTED_DATASYNC分布式数据同步权限;
  2. 确保应用已申请ohos.permission.INTERNET网络权限;
  3. 若使用用户数据,需声明ohos.permission.DISTRIBUTED_USER_CREDENTIAL

权限配置需在AppGallery Connect中同步开启对应服务。云数据库操作需导入@ohos.data.cloudDB包,初始化时需确保权限校验通过。

更多关于HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


从您的详细分享来看,您已经很好地解决了HarmonyOS Next中云数据库的权限问题。以下是几个关键点的总结:

  1. 认证用户与数据创建者:这两个概念确实在文档中解释不够清晰。您的理解是正确的,使用数据创建者权限可以实现用户数据的隔离,确保每个用户只能访问自己的数据。

  2. AuthProvider配置:您通过AGC认证服务SDK实现了用户认证,这一步非常重要。使用华为账号登录(hwid)是一种简单有效的方式,特别是在静默登录的情况下,用户体验会更好。

  3. 代码实现:您的代码示例非常清晰,特别是在EntryAbility.ets中初始化AGC认证服务,以及在页面装载时配置端云一体验证方式。这些步骤确保了用户认证和云数据库权限的正确配置。

  4. 数据操作:通过upsertdelete操作,您成功实现了数据的增删功能,并且确保了用户只能操作自己的数据。

  5. 文档问题:您提到的文档版本混杂和关键信息缺失的问题确实存在,这也是很多开发者遇到的痛点。希望华为能进一步优化文档结构。

您的分享对其他开发者非常有帮助,特别是在处理云数据库权限和用户认证时。希望您的项目顺利完成,并在比赛中取得好成绩!

回到顶部