SAS Azure 签名不匹配

2023-12-14

我尝试在 php 中为 azure 存储上的 blob 创建 SAS。 我编写以下代码:

$key ="...";

$end = date('Y-m-d\TH\:i\:s\Z', strtotime('+1 day'));

function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){
 /* Create the signature */
 $_arraysign = array();
 $_arraysign[] = $permissions;
 $_arraysign[] = '';
 $_arraysign[] = $expiry;
 $_arraysign[] = '/'.$accountName . '/' . $container . '/' . $blob;
 $_arraysign[] = '';
 $_arraysign[] = "2015-12-11"; //the API version is now required 
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';

 $_str2sign = implode("\n", $_arraysign);

 return base64_encode(hash_hmac('sha256', urldecode(utf8_encode($_str2sign)), base64_decode($key), true));
}

function getBlobUrl($accountName, $container, $blob, $resourceType, $permissions, $expiry, $_signature){
 /* Create the signed query part */
 $_parts = array();
 $_parts[] = 'sv=2015-12-11';

 $_parts[] = 'ss=b';
 $_parts[] = 'srt=' . $resourceType;
 $_parts[] = (!empty($permissions))?'sp=' . $permissions:'';
 $_parts[] = (!empty($expiry))?'se=' .$expiry:'';
 $_parts[] = 'spr=https';
 $_parts[] = 'sig=' . urlencode($_signature);


 /* Create the signed blob URL */
 $_url = 'https://'
 .$accountName.'.blob.core.windows.net/'
 . $container . '/'
 . $blob . '?'
 . implode('&', $_parts);

 return $_url;
 }


$sig = getSASForBlob("cloudviewer","450-423-422-392", "thumbnail.jpeg", "r",     $end, $key);
$url = getBlobUrl("cloudviewer","450-423-422-392","thumbnail.jpeg","o","r", $end, $sig);

echo(json_encode(array('url' => $url, 'sig' => $sig, 'expiry' => $end)));

我收到的网址结果是:

出现身份验证错误:签名不匹配。使用的签名字符串是 cloudviewer r b o 2016-12-09T17:08:25Z https 2015-12-11

我直接从 Azure 创建一个 SAS 并且有 url它的工作原理与第一个类似。

我已经尝试过

$_arraysign[] = '/blob/'.$accountName . '/' . $container . '/' . $blob;
$_arraysign[] = $accountName . '/' . $container . '/' . $blob;

你有什么主意吗 ?

thanks


您似乎正在尝试生成帐户 SAS 令牌,如第二个示例所述https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1#examples-of-sas-uris。根据我的理解,您只能生成一个通用的 blob SAS 令牌,如上面文章中提到的第一个示例。

同时,根据描述构造签名字符串,您在生成签名时错过了几个部分。

因此,请尝试以下代码片段:

function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){
 /* Create the signature */
 $_arraysign = array();
 $_arraysign[] = $permissions;
 $_arraysign[] = '';
 $_arraysign[] = $expiry;
 $_arraysign[] = '/blob' .'/'.$accountName . '/' . $container . '/' . $blob;
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = "2015-12-11"; //the API version is now required 
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';
 $_arraysign[] = '';

 $_str2sign = implode("\n", $_arraysign);

 return base64_encode(hash_hmac('sha256', urldecode(utf8_encode($_str2sign)), base64_decode($key), true));
}

function getBlobUrl($accountName, $container, $blob, $resourceType, $permissions, $expiry, $_signature){
 /* Create the signed query part */

 $_parts = array();
    $_parts[] = (!empty($expiry)) ? 'se=' . urlencode($expiry) : '';
    $_parts[] = 'sr=' . $resourceType;
    $_parts[] = (!empty($permissions)) ? 'sp=' . $permissions : '';
    $_parts[] = 'sig=' . urlencode($_signature);
    $_parts[] = 'sv=2015-12-11';
    $_parts[] = 'rscd=';


 /* Create the signed blob URL */
 $_url = 'https://'
 .$accountName.'.blob.core.windows.net/'
 . $container . '/'
 . $blob . '?'
 . implode('&', $_parts);

 return $_url;
 }

$sig = getSASForBlob(AZURE_ACC_NAME,AZURE_CONTAINER, BLOB, "r", $endDate, AZURE_PRIMARY_KEY);
$url = getBlobUrl(AZURE_ACC_NAME,AZURE_CONTAINER,BLOB,"b","r", $endDate, $sig);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SAS Azure 签名不匹配 的相关文章

  • PHP 有效读取 csv 文件

    有几种使用 PHP 读取 CSV 文件的方法 我以前用过explode函数将每一行放入一个数组中 然后explode逗号并使用trim删除数据周围的任何引号 本来就很乱 PHP 5 现在有fgetcsv和 str getcsv 我猜这是这些
  • HTML 表单 POST 到 PHP 页面 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 好的 我创
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • Cosmos DB 在同一查询上随机成功和失败,表示它们是跨分区,但实际上不是

    我有一个分区键为 flightConversationId 的集合 我正在做一个非常简单的查询 按分区键字段 SELECT from root WHERE root flightConversationId b36d13c0 cbec 11
  • 如何在 PHP 中正确分割路径

    执行以下操作的最佳方法是什么 我通过 AJAX 请求获取路径 e g dir1 dir2 dir3 dir4 我需要在我的网页上这样展示它 dir1 gt gt dir2 gt gt dir3 gt gt dir4 它们每个都是 html
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • PHP 中的正则表达式:找到第一个匹配的字符串

    我想在非常长的文本中找到第一个匹配的字符串 我知道我可以使用 preg grep 并获取返回数组的第一个元素 但是 如果我只需要第一场比赛 或者我知道提前只有一场比赛 那么这样做效率不高 有什么建议吗 预匹配 http www php ne
  • jQuery和PHP中如何知道返回数据是Json还是String?

    我想在客户端 jQuery 检查 PHP 函数返回的数据是否是 Json 对象或 String 来分配不同的函数 如果 json 的格式不正确 jQuery 的 parseJson 将生成异常 您可以将调用包装在 try catch 块中
  • Azure 应用服务自定义身份验证获取 System.ArgumentNullException:“值不能为空”“参数名称:提供程序”

    我有一个简单的 dot net 移动应用程序 具有自定义身份验证 如下所示 https learn microsoft com en us azure app service mobile app service mobile dotnet
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • URL 重写帮助

    RewriteEngine on RewriteCond REQUEST URI index php RewriteRule index php q 1 L 这应该将任何 url 重写为 index php q url 并且它可以工作 反正
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • 转换MAC地址格式

    我刚刚编写了一个小脚本 从交换机中提取数百个 MAC 地址进行比较 但它们的格式为 0025 9073 3014 而不是标准的 00 25 90 73 30 14 我对如何转换它感到困惑 我能想到的最好的办法就是在 处将它们分解成碎片 然后
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • PHP - 查找和比较日期

    你好 我有 foreach 我可以在其中获取数据库中的事件数据 我使用数据库中的日期名称 例如 event date 我需要在一个 div 中比较具有相同日期和输出的操作 例如我有这个事件 活动一 9 月 13 日 活动二 9 月 1 日
  • PHP 中的 Zip 流

    我有一个 PHP 脚本 可以动态创建 zip 文件并强制浏览器下载该 zip 文件 问题是 我可以直接将zip文件写入连接到用户浏览器的输出流 而不是先将其保存为服务器上的真实文件 然后发送文件吗 提前致谢 如果您的 Web 服务器运行的是

随机推荐

  • 如何通过 MySQL 查询使用 BirthDate 列获取年龄?

    我在 MySQL 数据库表中有一个 BirthDate 列来存储用户的出生日期 现在我在 html php 中有两个字段的表单 1 年龄从 2 年龄到 如果用户想要获取年龄在 10 岁到 20 岁之间的所有用户 是否可以使用 BirthDa
  • 如何在 Python 中创建 mdb 数据库文件?

    我想用 Python 在 Windows 中创建一个 mdb 数据库文件 但似乎无法用 Python 文档弄清楚它 我读到的所有内容都与建立连接以及如何使用光标有关 有什么想法吗 谢谢 我的经验comtypes模块已经相当不错了 然而 您可
  • 使用 seq() 和 rep() 迭代数字

    我需要使用rep and seq 得到以下向量 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 通常我只会使用for声明来实现这一点 但我被限制使用它 只能使用rep and seq 来实
  • 添加新的核心数据模型版本后出错

    我添加了一个新的模型版本 并将核心数据模型设置为使用该新版本 但当应用程序尝试启动时出现此错误 用于打开持久存储的托管对象模型版本与用于创建持久存储的版本不兼容 我猜问题是当前的持久存储是模型的旧版本 有没有办法直接删除它 然后再创建一个新
  • Three.js r125 BufferGeometry`顶点`不存在

    我正在更新 Three js 我发现当我升级到 r125 时 尝试设置vertices由于缺少方法 BufferGeometry 失败 似乎也已删除verticesNeedUpdate The 迁移指南似乎没有对此发出警告并且变更日志据我所
  • Team Foundation Server 2010 不支持我的 .tfignore 文件

    这是我的 tfignore 它位于分支的根目录中并提交给 TFS 但它永远不会受到尊重 我想我错过了一些我在阅读中不清楚的语法细节TechNet 有关 tfignore 文件的文章 但是什么 Team Foundation Server S
  • PHP:使用 php 邮件程序发送 ical

    我正在尝试使用 php 邮件程序发送 ical 这是我的功能 function sendIcalEmail firstname lastname email meeting date meeting name meeting duratio
  • 创建谷歌日历事件

    我正在尝试使用下面给出的代码创建谷歌日历事件 但我得到了类 Event not found 如何创建新事件 请帮忙
  • C - 防止在块作用域中使用相同的变量名

    我继承了一些代码 我将对其进行重构 这些代码在不同范围内广泛使用具有相同名称的多个变量 即 int test 456 int main void int test 0 for i 0 i
  • 使用 python 进行 Modelica 参数研究

    我想使用 python 在不同的 modelica 建筑库 建筑物 IDEAS 中运行参数研究 例如 更改渗透率 我尝试过 simulateModel和simulateExtendedModel zone n50 value 我的问题 为什
  • Microsoft Sql Server Management Studio 备份大小变为负值

    问题是我需要解释工厂中数据库的不同大小的备份 有时 即使没有从系统中删除数据 大小之间的差异也是负数 Datum Backupfile file Size KB Diff 6 1 10 backup201006010100 bak 3355
  • 如何配置 HttpClient 在收到 301 HTTP 状态代码时不自动重定向?

    考虑一个重定向的 ASP NET Web API 服务 public class ThisController ApiController more methods public override HttpResponseMessage P
  • MPI任务调度

    我想使用 MPI 开发一个任务调度程序 其中有一个主处理器和多个工作 客户端处理器 每个工作进程都拥有计算所需的所有数据 但从主进程获取要处理的索引 计算完成后 worker 返回一些数据给 master 问题是有些进程会很快 有些会很慢
  • chm 文件支持哪些 css 版本?

    我正在编写一个样式表以与我的编译帮助文件一起使用 看起来 CSS2 通常可以工作 但我不确定 CSS 选择器 例如 gt and CHM 格式是否等同于 IE 7 fwiw 我正在 Windows 7 上进行创作 并且安装了 IE9 在 W
  • 测试 Jasmine 被拒绝的承诺

    在我使用 AngularFire2 的 Angular2 应用程序中 我有一个AuthService它尝试使用 Firebase 进行匿名身份验证 我正在尝试编写一个期望的测试AngularFireAuth s signInAnonymou
  • 通过纯 JS 缩小图像尺寸会导致图像尺寸膨胀(以字节为单位)

    我是一名服务器端开发人员 正在学习客户端操作的诀窍 从纯 JS 开始 目前我正在使用纯 JS 来调整通过浏览器上传的图像的尺寸 我遇到了缩小 1018 x 1529 尺寸的情况 jpg文件大小为 400 x 601 jpeg正在生成一个更大
  • 使用 Apps 脚本检测 Google 电子表格中的背景颜色变化

    我创建了一个onEdit 在 Google App Script 中触发 但仅当我更改单元格的值时才有效 当我改变背景颜色时就不会了 我该如何修复它 注意 有一个关于 onChange e 的未决问题报告它不起作用 看Google 脚本 o
  • 如何在 Shinydashboard R 中仪表板标题的中心显示图像?

    我有以下代码 可以制作一个简单的闪亮应用程序 library shinydashboard library shiny ui lt dashboardPage dashboardHeader title tags img src https
  • 在 Python 中的装饰器中重新分配参数

    考虑一个带有参数的简单 Python 装饰器 def decorator factory a None def decorator func def wrapper args kws return func args kws a retur
  • SAS Azure 签名不匹配

    我尝试在 php 中为 azure 存储上的 blob 创建 SAS 我编写以下代码 key end date Y m d TH i s Z strtotime 1 day function getSASForBlob accountNam