uni-app中普通云函数向opendb-verify-codes表添加数据报错“权限校验未通过,未能获取当前用户信息,当前用户为匿名身份”

发布于 1周前 作者 wuwangju 来自 Uni-App

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表添加数据,并确保用户身份信息的正确传递。注意,实际应用中需要根据具体的业务逻辑调整代码,比如验证码的生成和验证逻辑。

回到顶部