uni-app中普通云函数向opendb-verify-codes表添加数据报错“权限校验未通过,未能获取当前用户信息,当前用户为匿名身份”
uni-app中普通云函数向opendb-verify-codes表添加数据报错“权限校验未通过,未能获取当前用户信息,当前用户为匿名身份”
报错如下:
[uni-sms/ac1cc3201735431011879105441/387ms/DEBUG] jql报错
at _callCloudFunction (/tmp/function/@common_modules/uni-cloud-jql/index.js:1:6144)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
errMsg: '权限校验未通过,未能获取当前用户信息,当前用户为匿名身份,请参考文档:https://uniapp.dcloud.net.cn/uniCloud/schema.html#handler-permission-error',
errCode: 'TOKEN_INVALID_ANONYMOUS_USER',
code: 'TOKEN_INVALID_ANONYMOUS_USER',
subject: undefined,
errSubject: undefined,
cause: undefined,
requestId: undefined
}
我的普通云函数的入参event对象能获取到uniIdToken,为什么会报这个错误呢,我去查看opendb-verify-codes表的dbscheme也没有permission属性的设置,我也没去修改它。
我的云函数代码如下:
// 发送单条短信示例
'use strict';
const crypto = require('crypto');
function generateCode() {
return crypto.randomInt(100000, 999999).toString();
}
const smscode = generateCode()
exports.main = async (event, context) => {
const now = Date.now()
console.log(event,context)
const dbJQL = uniCloud.databaseForJQL({
event,
context
});
try {
const res = await uniCloud.sendSms({
appid: 'UNIC0640D1',
phone: event.mobile,
templateId: '33680', // 请替换为自己申请的模板id
data: {
code: smscode
}
})
console.log('test sms')
// 调用成功,请注意这时不代表发送成功
const res1 = await dbJQL.collection('opendb-verify-codes').where({
mobile: event.mobile,
status: 0,
scene: 'claim-shop'
}).orderBy('created_date desc').get({getCount:true});
console.log(res1)
if(res1.count == 0){
const res2 = await dbJQL.collection('opendb-verify-codes').add({
mobile: event.mobile,
scene: 'claim-shop',
code: smscode,
state: 0,
ip: dbJQL.getCloudEnv('$cloudEnv_clientIP'),
create_date: now,
expired_date: now + 300000
});
console.log(res2)
}
return res
} catch(err) {
// 调用失败
console.log(err.errCode)
console.log(err.errMsg)
return {
code: err.errCode,
msg: err.errMsg
}
}
};
1 回复
在uni-app中使用云函数向opendb-verify-codes表添加数据时遇到“权限校验未通过,未能获取当前用户信息,当前用户为匿名身份”的错误,通常是因为云函数的调用没有携带有效的用户身份信息。在云开发环境中,对于数据库的访问权限通常是基于用户身份的。以下是一个通过云函数安全地向opendb-verify-codes表添加数据的示例,同时确保携带用户身份信息。
步骤 1: 确保用户登录
在调用云函数之前,确保用户已经登录。可以使用uni-app提供的登录接口,例如通过微信、QQ等第三方登录,或者自定义登录方式。
uni.login({
provider: 'weixin', // 或其他登录方式
success: function (loginRes) {
// 保存登录凭证
uni.setStorageSync('loginCode', loginRes.code);
// 后续可以调用获取用户信息的接口
}
});
步骤 2: 云函数代码
在云函数中,通过cloud.getWXContext()
获取用户信息,并使用该信息来确保数据库操作的安全性。
// 云函数入口文件
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext();
// 检查是否已登录
if (!wxContext.OPENID) {
return {
success: false,
message: '用户未登录'
};
}
try {
const addResult = await db.collection('opendb-verify-codes').add({
data: {
code: event.code, // 假设传入的验证码
userId: wxContext.OPENID, // 用户ID
expireTime: db.serverDate().add(3600 * 1000), // 验证码有效期1小时
},
});
return {
success: true,
result: addResult,
};
} catch (error) {
return {
success: false,
error: error.message,
};
}
};
步骤 3: 调用云函数
在前端调用云函数时,确保用户已经登录,并且云函数调用携带了正确的用户信息。
uni.cloud.callFunction({
name: 'yourCloudFunctionName', // 云函数名称
data: {
code: 'yourVerificationCode' // 要添加的数据
},
success: function(res) {
console.log('云函数调用成功', res.result);
},
fail: function(err) {
console.error('云函数调用失败', err);
}
});
以上代码示例展示了如何在uni-app中通过云函数安全地向opendb-verify-codes表添加数据,并确保用户身份信息的正确传递。注意,实际应用中需要根据具体的业务逻辑调整代码,比如验证码的生成和验证逻辑。