使用Next.js客户端上传至Cloudinary时遭遇401未授权错误
核心问题:签名参数键名不匹配
你的代码中生成签名时使用了驼峰式的timeStamp作为参数键名,但Cloudinary要求签名计算时必须使用**小写的timestamp**键名。这会导致签名计算的参数集合与实际上传请求中的参数集合不匹配,即使时间戳值和签名字符串看起来一致,Cloudinary的服务器端验证也会失败。
修复代码:
修改getUploadSignature函数中的签名生成部分:
function getUploadSignature(){ const timeStamp = Math.round((new Date).getTime() / 1000); // 把timeStamp键名改为小写的timestamp const signature = cloudinary.utils.api_sign_request({ folder: 'imageUploadTest', timestamp: timeStamp, }, cloudinaryConfig.api_secret); console.log({getSignTS: signature, timeStamp}); return { cloudName: cloudinaryConfig.cloud_name, apiKey: cloudinaryConfig.api_key, timeStamp, signature, }; }
其他需要修正的点
移除多余的CloudName参数:
你在getSignedFormData中向FormData添加了cloudName字段,但该字段不属于Cloudinary上传请求的必填参数,且未包含在签名计算的参数中,额外参数会触发签名验证失败。请删除这行代码:formData.append('cloudName', cloudName);固定文件夹模式的适配:
老账户的固定文件夹模式下,需确认folder: 'imageUploadTest'是账户设置的固定文件夹的子路径,或者尝试暂时移除folder参数,使用默认固定文件夹上传,排查是否为文件夹权限/路径匹配问题。验证签名计算逻辑:
可以手动用Cloudinary的签名规则验证:将timestamp、folder参数按字典序排序,拼接成folder=imageUploadTest×tamp=xxxx的格式,再加上你的api_secret,用MD5哈希计算,对比是否和生成的签名一致,确保api_secret配置无误。确认上传请求URL:
确保客户端上传请求的URL格式正确:https://api.cloudinary.com/v1_1/${cloudName}/image/upload,替换${cloudName}为你的Cloudinary云名称。
内容的提问来源于stack exchange,提问作者Manav

