0

0

深入解析Cloudinary REST API图片删除:签名生成与实践指南

碧海醫心

碧海醫心

发布时间:2025-11-12 13:15:01

|

653人浏览过

|

来源于php中文网

原创

深入解析Cloudinary REST API图片删除:签名生成与实践指南

本教程详细探讨cloudinary rest api中图片删除(destroy)操作的正确实现方法。核心聚焦于api请求的签名生成机制,指出常见错误在于未能将所有必要参数按字母顺序纳入签名字符串。文章将提供详细的签名生成规则、修正后的php代码示例,并强调在api交互中确保请求参数完整性和安全性的关键实践。

Cloudinary REST API与安全认证概述

Cloudinary提供了一套强大的RESTful API,允许开发者通过程序化方式管理媒体资源,包括上传、转换和删除等操作。为了确保这些API请求的安全性与合法性,Cloudinary对大多数管理型API调用强制要求进行签名认证。这意味着每个请求都必须包含一个根据特定规则生成的signature参数,用以验证请求的真实性和完整性。destroy API作为其中一项关键功能,用于删除指定public_id的图片,其安全性要求同样严格,需要正确的签名才能成功执行。

理解Cloudinary API签名生成规则

Cloudinary的签名生成机制是其认证体系的核心。要成功地对API请求进行签名,必须遵循以下详细规则:

  1. 排除特定参数: 在构建用于签名的字符串时,以下参数不应被包含在内:
    • file (或用于上传的upload_preset)
    • cloud_name (通常包含在请求URL中)
    • resource_type (虽然是请求的一部分,但不参与签名字符串)
    • api_key (作为独立参数传递)
  2. 包含所有其他参数: 除上述排除项之外,请求中所有其他要发送的参数都必须包含在签名字符串中。
  3. 参数排序: 包含在签名字符串中的参数必须按照其参数名称的字母顺序进行排序。
  4. 格式化: 排序后的参数应以key=value的形式连接,并使用&符号作为分隔符。例如:param1=value1¶m2=value2。
  5. 拼接API Secret: 将格式化后的参数字符串与您的api_secret(Cloudinary账户的密钥)直接连接起来。
  6. 哈希计算: 对最终拼接的字符串执行SHA-1哈希计算,生成最终的signature值。

例如,如果一个请求包含invalidate、public_id和timestamp这三个需要签名的参数,那么签名字符串的构建顺序应为invalidate=true&public_id=folder/sample_public_id×tamp=1234567890,然后将此字符串与api_secret拼接后进行SHA-1哈希。

常见错误分析:签名参数不完整

在实际开发中,一个非常普遍的错误是未能将所有参与签名的参数都完整地包含在签名字符串中。例如,如果一个destroy请求需要发送public_id、timestamp和invalidate参数,但签名生成逻辑仅使用了timestamp,那么生成的签名将是无效的。Cloudinary服务器在接收到此类请求时,会因签名不匹配而拒绝执行操作。

以下是原始问题中出现的错误示例,它仅对timestamp进行了签名:

Okaaaay
Okaaaay

适用于所有人的AI文本和内容生成器

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

此代码片段的问题在于,destroy请求中除了timestamp,还包含了public_id和invalidate。根据Cloudinary的签名规则,所有非排除参数都必须参与签名,且需按字母顺序排列

修正Cloudinary图片删除请求的签名

要成功地通过Cloudinary REST API删除图片,关键在于确保签名字符串包含了所有必要的参数(如public_id、timestamp和invalidate),并且这些参数已按照字母顺序正确排列。

修正后的PHP代码示例:

<?php

// 您的Cloudinary凭据,请替换为您的实际值
$api_key = "YOUR_API_KEY";
$api_secret = "YOUR_API_SECRET";
$cloud_name = "YOUR_CLOUD_NAME";

// 要删除的图片信息
$public_id = "folder/sample_public_id"; // 替换为要删除的图片public_id
$timestamp = time(); // 当前时间戳
$invalidate = true; // 是否从CDN缓存中删除,布尔值

// 构建参与签名的参数数组
// 注意:Cloudinary签名时,布尔值如invalidate需转换为字符串 "true" 或 "false"
$params_to_sign = array(
    'invalidate' => ($invalidate ? 'true' : 'false'), // 转换为字符串
    'public_id' => $public_id,
    'timestamp' => $timestamp
);

// 对参数数组按键名进行字母排序
ksort($params_to_sign);

// 将排序后的参数构建成查询字符串形式
$signature_string = http_build_query($params_to_sign);

// 拼接API Secret并计算SHA-1签名
$signature = sha1($signature_string . $api_secret);

// 构建POST请求数据,这里可以传递原始布尔值或字符串
$postRequest = array(
    'public_id' => $public_id,
    'timestamp' => $timestamp,
    'api_key' => $api_key,
    'signature' => $signature,
    'resource_type' => 'image', // 指定资源类型
    'invalidate' => $invalidate // 传递原始布尔值
);

// 初始化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_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 生产环境中强烈建议启用SSL证书验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);

// 执行cURL请求
$response = curl_exec($ch);

// 检查cURL错误
if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    // 打印Cloudinary API的响应
    print_r($response);
}
curl_close($ch);

?>

关键修正点说明:

  1. $params_to_sign 数组构建: 将所有需要参与签名的参数(invalidate、public_id、timestamp)放入一个关联数组中。注意,invalidate布尔值在签名字符串中需转换为字符串'true'或'false'。
  2. ksort($params_to_sign): 使用ksort()函数对参数数组按键名进行字母排序,这是生成正确签名字符串的关键一步。
  3. http_build_query($params_to_sign): 此函数将排序后的数组自动构建成key=value&key2=value2的URL查询字符串形式,简化了手动拼接的过程。
  4. sha1($signature_string . $api_secret): 将构建好的参数字符串与您的api_secret拼接后,再进行SHA-1哈希计算,生成最终的签名。

注意事项与最佳实践

  • public_id的准确性: 确保您提供的public_id与要删除的Cloudinary资源完全匹配,包括任何文件夹路径。例如,如果图片存储在my_folder/my_image,则public_id必须是my_folder/my_image。
  • invalidate参数: 当设置为true时,Cloudinary会尝试从其CDN缓存中删除该资源。请注意,CDN缓存的清除可能需要一些时间才能在全球范围内生效。
  • 错误处理: 在生产环境中,对cURL请求的返回值进行严格检查至关重要。同时,解析Cloudinary API的响应(通常是JSON格式)以获取操作状态、result字段和任何错误信息,能够帮助您进行有效的调试和错误恢复。
  • API Secret安全: api_secret是您Cloudinary账户的敏感凭证,必须严格保密。它绝不能暴露在客户端代码中或任何公共可访问的位置,只能在安全的服务器端代码中使用。
  • resource_type: 尽管resource_type(如image、video、raw)是API请求URL和POST数据的一部分,但它不参与签名字符串的生成。
  • SSL验证: 在生产环境中,强烈建议启用CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER,以确保您的应用程序与Cloudinary服务器之间的通信是经过加密和身份验证的,防止中间人攻击。

总结

成功通过Cloudinary REST API删除图片的核心在于正确、完整地生成请求的签名。这要求开发者严格遵循Cloudinary的签名规则,即:将所有非排除参数(如public_id、timestamp、invalidate)按照字母顺序排列,构建成查询字符串,然后与您的api_secret拼接后进行SHA-1哈希计算。通过遵循本教程提供的详细指导和修正后的代码示例,您可以有效避免常见的签名错误,确保Cloudinary图片删除操作的顺利执行,并维护应用程序与Cloudinary服务交互的安全性。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

curl_exec
curl_exec

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

454

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字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

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

共137课时 | 13.1万人学习

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号