0

0

解决 Cloudinary REST API 删除失败问题:正确生成认证签名

霞舞

霞舞

发布时间:2025-11-10 12:30:23

|

882人浏览过

|

来源于php中文网

原创

解决 Cloudinary REST API 删除失败问题:正确生成认证签名

cloudinary rest api 删除资源时,常见的失败原因在于认证签名生成不正确。核心在于,除特定参数外,所有请求参数(如 `public_id` 和 `invalidate`)必须按字母顺序排列并包含在签名字符串中,再与 `api_secret` 结合进行 sha1 哈希。本教程将详细指导如何正确生成签名,确保 cloudinary 资源销毁请求成功执行。

Cloudinary API 认证机制概述

Cloudinary 提供强大的媒体管理服务,其 REST API 允许开发者通过编程方式上传、转换和删除资源。为了确保请求的安全性,Cloudinary 对大多数 API 调用都要求进行身份验证,其中核心机制是生成一个认证签名。这个签名通过结合请求参数和您的 API 密钥(api_secret)生成,用于验证请求的合法性。

当您尝试使用 destroy API 删除图片或其他资源时,如果请求没有成功,一个非常常见的原因就是签名生成不正确。

签名生成的核心规则

Cloudinary 签名生成的关键在于以下几点:

  1. 参数范围: 除了 file、cloud_name、resource_type 和 api_key 这四个参数外,所有其他在请求中发送的参数都必须包含在签名字符串中。
  2. 字母顺序: 签名字符串中的参数必须按照其参数名的字母顺序进行排列。
  3. 连接方式: 参数之间使用 & 符号连接,形成 key=value 的格式。
  4. 最终哈希: 将所有排序好的参数字符串与您的 api_secret 拼接在一起,然后进行 SHA1 哈希计算,得到最终的签名。

在 destroy API 的场景中,常见的请求参数包括 public_id、timestamp 和 invalidate。如果您的请求中包含了这些参数,它们就必须全部参与签名计算。

修正后的签名生成示例

考虑一个删除资源的请求,其中包含 public_id、timestamp 和 invalidate 参数。原始代码可能只对 timestamp 进行了签名,导致其他参数未被验证,从而使请求失败。

原始(错误)的签名生成方式:

$timestamp = time();
$signature = sha1("timestamp=".$timestamp.$api_secret); // 错误:只包含了 timestamp

正确(修正后)的签名生成方式:

AssemblyAI
AssemblyAI

转录和理解语音的AI模型

下载

根据 Cloudinary 的规则,我们需要将 invalidate、public_id 和 timestamp 这三个参数按字母顺序排列并包含在签名字符串中。

$api_secret = "YOUR_API_SECRET"; // 请替换为您的 Cloudinary API Secret
$timestamp = time();
$public_id = "folder/sample_public_id"; // 待删除资源的 public_id
$invalidate = true; // 是否从 CDN 缓存中删除

// 按照参数名的字母顺序排列并组合参数
// 注意:布尔值 true 在字符串中通常表示为 "true"
$signature_string = "invalidate=" . ($invalidate ? "true" : "false") . 
                    "&public_id=" . $public_id . 
                    "&timestamp=" . $timestamp;

$signature = sha1($signature_string . $api_secret);

请注意,invalidate=true 在签名字符串中必须以 invalidate=true 的形式出现,而不是 invalidate=1 或其他形式,这取决于 Cloudinary 对布尔值的具体要求。

完整的 PHP cURL 请求示例

将修正后的签名生成逻辑整合到完整的 PHP cURL 请求中,示例如下:

<?php

// 您的 Cloudinary 凭据
$cloud_name = "YOUR_CLOUD_NAME"; // 替换为您的 Cloudinary Cloud Name
$api_key = "YOUR_API_KEY";       // 替换为您的 Cloudinary API Key
$api_secret = "YOUR_API_SECRET"; // 替换为您的 Cloudinary API Secret

// 请求参数
$public_id = "folder/sample_public_id"; // 待删除资源的 public_id
$timestamp = time();
$invalidate = true; // 是否从 CDN 缓存中删除

// 1. 构建签名字符串:按照参数名的字母顺序排列并组合
// 参数包括:invalidate, public_id, timestamp
$signature_params = [
    'invalidate' => ($invalidate ? "true" : "false"), // 布尔值转换为字符串
    'public_id' => $public_id,
    'timestamp' => $timestamp
];
ksort($signature_params); // 确保参数按键名字母顺序排序

$signature_string_parts = [];
foreach ($signature_params as $key => $value) {
    $signature_string_parts[] = "{$key}={$value}";
}
$signature_string = implode("&", $signature_string_parts);

// 2. 生成 SHA1 签名
$signature = sha1($signature_string . $api_secret);

// 3. 构建 POST 请求数据
$postRequest = array(
    'public_id' => $public_id,
    'timestamp' => $timestamp,
    'api_key' => $api_key,
    'signature' => $signature,
    'resource_type' => 'image', // 根据您要删除的资源类型设置,例如 'image', 'video', 'raw'
    'invalidate' => $invalidate
);

// 4. 发送 cURL 请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.cloudinary.com/v1_1/{$cloud_name}/image/destroy");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postRequest));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应内容
curl_setopt($ch, CURLOPT_FAILONERROR, false);  // 不在 HTTP 错误时终止,以便检查响应体
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);   // 建议开启 SSL 验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 建议开启 SSL 验证
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// curl_setopt($ch, CURLOPT_VERBOSE, true); // 调试时可以开启,查看详细 cURL 过程

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);

if ($curl_error) {
    echo "cURL 错误: " . $curl_error . "\n";
} else {
    echo "HTTP 状态码: " . $http_code . "\n";
    echo "Cloudinary 响应: " . $response . "\n";
    // 解析 JSON 响应
    $responseData = json_decode($response, true);
    if ($responseData && isset($responseData['result']) && $responseData['result'] === 'ok') {
        echo "资源删除成功!\n";
    } elseif ($responseData && isset($responseData['error'])) {
        echo "删除失败: " . $responseData['error']['message'] . "\n";
    } else {
        echo "未知错误或非预期响应。\n";
    }
}

curl_close($ch);

?>

重要提示:

  • 请将 YOUR_CLOUD_NAME、YOUR_API_KEY 和 YOUR_API_SECRET 替换为您的实际 Cloudinary 账户信息。
  • public_id 必须是您要删除的资源的准确公共 ID,包括任何文件夹路径。
  • resource_type 应与您要删除的资源类型匹配(image、video 或 raw)。

注意事项与最佳实践

  1. 使用官方 SDK: 强烈建议使用 Cloudinary 官方提供的 SDK(如 PHP SDK、Node.js SDK、Python SDK 等)。这些 SDK 已经封装了复杂的签名生成逻辑,可以大大简化开发过程并减少出错的可能性。它们会自动处理参数排序和签名计算。
  2. 安全管理 API Secret: 您的 api_secret 是敏感信息,绝不能暴露在客户端代码或公共可访问的存储库中。它应该始终在服务器端进行管理和使用。
  3. 错误处理: 始终检查 API 调用的返回值和 HTTP 状态码。Cloudinary 会在响应中提供详细的错误信息,帮助您诊断问题。例如,HTTP 401 状态码通常表示认证失败。
  4. CDN 缓存失效: invalidate=true 参数会尝试从 Cloudinary 的 CDN 缓存中删除资源,这可能需要一些时间来完全生效。
  5. 参数一致性: 确保用于生成签名的参数与实际发送到 Cloudinary API 的参数完全一致。任何不匹配都将导致签名验证失败。

总结

Cloudinary REST API 的删除操作失败,最常见的原因是认证签名生成不正确。解决此问题的关键在于理解 Cloudinary 签名机制:所有请求参数(除特定例外)必须按字母顺序排列并包含在签名字符串中,然后与 api_secret 一起进行 SHA1 哈希。通过严格遵循这一规则,您可以确保 API 请求得到正确认证,从而成功执行资源删除操作。在实际开发中,优先使用 Cloudinary 官方 SDK 是提高效率和避免错误的最佳实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

455

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

183

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号