HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南
HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南
事件背景
近来看到开发者论坛举办了端云一体的比赛,想了个小项目提交。之前只用过云函数没用过云数据库,正好借此机会学习一下。没想到一开始就踩了坑,于是撰文记录一下。
项目情况
这次的项目是一个简单的手机数独题库,用户通过填写数独题目可以保存到自己的题库中,也可以从题库中删除题目,当然数据库是同一个,但是会有用户隔离的机制,每个用户只能访问自己的数据。
起初通过文档创建Profile
和调试证书
,开通云数据库
,创建objecttype
,部署后在端侧代码中调用插入数据
,显示权限不足,这个时候才终于知道了官方文档中还有很多细节没有提及。
官方手册链接如下:
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模块的文档如下:
随后到处翻,在手册的getAccessToken章节,手册详细提到了可以使用AGC提供的认证服务SDK自动处理AccessToken,开发者并不需要理会具体实现,只要引入相关配置使用手机、邮箱或华为账号进行登录认证即可。这么重要的信息放在getAccessToken章节,感觉放的位置有点不对。点击登录认证字样后可以跳到AGC认证服务SDK的相关功能文档。
AGC认证服务SDK链接如下:
AGC认证服务SDK描述了可以通过不同的方式登录,最简单当然是通过华为账号登录,并提供了相关代码。但通常开发者看到这里很容易把Account Kit的华为账号登录和AGC认证服务的华为账号登录弄混,我印象中参加活动时候有老师说过这个AGC的SDK是很多平台都可以用的,所以云数据库大概了也是能够被其他平台使用,放在AGC的SDK里面比较合情合理,至此大概摸清了整个流程,开始撸码。
尝试配置AuthProvider
准备签名文件
准备几个东西,当然包括了csr文件,profile文件和调试证书,因为端云一体化需要手动配置签名,所以需要准备这些文件。
在AGC的后台打开认证服务,打开华为账号登录
根据提示,打开华为账号登录的时候要求输入ClientID和ClientSecret,这个在应用页面的OAuth栏位已经标明出来,可以直接复制到相应的输入框里。
下载json配置文件,同时复制ClientId备用
在项目的首页,找到下载点并记录ClientId
开始写代码
在DevEco配置AGC认证服务,加入package
把agc的json文件放置在AppScope的rawfile下面,并在module.json5中配置元数据,加入clientId信息
应用启动时加载SDK信息
在EntryAbility.ets
的onCreate
中加入以下代码,读取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.ets
的onDidBuild
中加入代码,页面装载时配置端云一体的认证方式,这里选择使用华为账号登录,注意这里如果用户已经静默登录过一次,是不需要再次登录的,再次登录反而报错
// 获取用户信息
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
在HarmonyOS Next中,《数拼拍拍》使用云数据库需配置以下权限:
- 在
module.json5
中添加ohos.permission.DISTRIBUTED_DATASYNC
分布式数据同步权限; - 确保应用已申请
ohos.permission.INTERNET
网络权限; - 若使用用户数据,需声明
ohos.permission.DISTRIBUTED_USER_CREDENTIAL
。
权限配置需在AppGallery Connect中同步开启对应服务。云数据库操作需导入@ohos.data.cloudDB
包,初始化时需确保权限校验通过。
更多关于HarmonyOS鸿蒙Next中《数独拍拍》云数据库权限填坑指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
从您的详细分享来看,您已经很好地解决了HarmonyOS Next中云数据库的权限问题。以下是几个关键点的总结:
-
认证用户与数据创建者:这两个概念确实在文档中解释不够清晰。您的理解是正确的,使用数据创建者权限可以实现用户数据的隔离,确保每个用户只能访问自己的数据。
-
AuthProvider配置:您通过AGC认证服务SDK实现了用户认证,这一步非常重要。使用华为账号登录(
hwid
)是一种简单有效的方式,特别是在静默登录的情况下,用户体验会更好。 -
代码实现:您的代码示例非常清晰,特别是在
EntryAbility.ets
中初始化AGC认证服务,以及在页面装载时配置端云一体验证方式。这些步骤确保了用户认证和云数据库权限的正确配置。 -
数据操作:通过
upsert
和delete
操作,您成功实现了数据的增删功能,并且确保了用户只能操作自己的数据。 -
文档问题:您提到的文档版本混杂和关键信息缺失的问题确实存在,这也是很多开发者遇到的痛点。希望华为能进一步优化文档结构。
您的分享对其他开发者非常有帮助,特别是在处理云数据库权限和用户认证时。希望您的项目顺利完成,并在比赛中取得好成绩!