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进行了签名:

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

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

StickerBaker
StickerBaker

免费开源的AI贴纸头像生成工具

下载

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

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

修正后的PHP代码示例:

 ($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服务交互的安全性。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1858

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1228

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1121

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1398

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1229

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

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

精品课程

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

共137课时 | 8万人学习

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

共6课时 | 6.9万人学习

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

共13课时 | 0.8万人学习

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

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