Google 存储桶的签名网址与提供的签名不匹配

2024-02-13

我在使用谷歌存储时遇到了困难。

所以我正在尝试做一个签名网址 https://cloud.google.com/storage/docs/access-control#Signed-URLs,已经有客户端 ID(这是一封电子邮件)和私钥(如所述here https://cloud.google.com/storage/docs/authentication#service_accounts) so:

STEP 1: 构造字符串 https://cloud.google.com/storage/docs/access-control#Construct-the-String

function googleBuildConfigurationString($method, $expiration, $file, array $options = []) {
    $allowedMethods = ['GET', 'HEAD', 'PUT', 'DELETE'];

    // initialize
    $method = strtoupper($method);
    $contentType = $options['Content_Type'];
    $contentMd5 = $options['Content_MD5'] ? base64_encode($options['Content_MD5']) : '';
    $headers = $options['Canonicalized_Extension_Headers'] ? $options['Canonicalized_Extension_Headers'] . PHP_EOL  : '';
    $file = $file ? $file : $options['Canonicalized_Resource'];

    // validate
    if(array_search($method, $allowedMethods) === false) {
        throw new RuntimeException("Method '{$method}' is not allowed");
    }
    if(!$expiration) {
        throw new RuntimeException("An expiration date should be provided.");
    }

    return <<<TXT
    {$method}
    {$contentMd5}
    {$contentType}
    {$expiration}
    {$headers}{$file}
    TXT;
}

到目前为止一切顺利(我认为),回显输出,它看起来与示例类似,所以现在对字符串进行签名

STEP 2: 对字符串进行签名 https://cloud.google.com/storage/docs/access-control#Signing-Strings最初我使用的是openssl_public_加密,搜索后发现 google-api-php-client 有 Google_Signer_P12 (实际上使用openssl_sign),所以该方法如下所示:

function googleSignString($certificatePath, $stringToSign) {
    return (new Google_Signer_P12(
        file_get_contents($certificatePath), 
        'notasecret'
    ))->sign($stringToSign);
}

在这里我不确定这是否正确签名,最终构建最终的网址

STEP 3: 构建 URL https://cloud.google.com/storage/docs/access-control#Assembling-the-URL

function googleBuildSignedUrl($serviceEmail, $file, $expiration, $signature) {
    return "http://storage.googleapis.com{$file}"
    . "?GoogleAccessId={$serviceEmail}"
    . "&Expires={$expiration}"
    . "&Signature=" . urlencode($signature);
}

但在浏览器中打开 URL 将检索:

<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>
        The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
    </Message>
    <StringToSign>GET 1437470250 /example/video.mp4</StringToSign>
</Error>

我添加了一个gist https://gist.github.com/MLoureiro/14503293c3cb2191e2f6最终脚本更容易阅读

那么知道我做错了什么吗?


我找到了解决方案,我所做的过期日期有一个错误:

$expiration = (new DateTime())->modify('+3h')->getTimestamp();

所以我改变了h to hours这样它现在就可以工作了,比如:

$expiration = (new DateTime())->modify('+3hours')->getTimestamp();

但这并没有完全解决问题,真正缺少的部分是Google_Signer_P12::sign()要求它以 base64 进行编码,这是在 google 文档中指定的:

Google Cloud Storage 期望其 API 中包含 Base64 编码签名。

然而我(错误地)认为Google_Signer_P12::sign()已经会这样做了,所以在我明白这是必需的之后,我将签名方法更改为:

function googleSignString($certificatePath, $stringToSign)
{
  return base64_encode((new Google_Signer_P12(
    file_get_contents($certificatePath),
    'notasecret'
  ))->sign($stringToSign));
}

现在正在工作!

我还更新了gist https://gist.github.com/MLoureiro/14503293c3cb2191e2f6对于任何想要使用它的人:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google 存储桶的签名网址与提供的签名不匹配 的相关文章

  • Apache 2.4.9 在启用 ssl 模块并设置 ssl 证书后失败

    Apache 在尝试设置 ssl 证书后抛出以下错误 ssl emerg pid 30907 AH02572 Failed to configure at least one certificate and key for localhos
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

    在这里我延伸一下我之前的问题 私人聊天系统MYSQL查询ORDERBY和GROUPBY https stackoverflow com questions 10929366 private chat system mysql query o
  • php表格:每行显示3个单元格[重复]

    这个问题在这里已经有答案了 我看这里 数组放入每行 5 个单元格的表格中 https stackoverflow com questions 9099568 array into a table with 5 cells in each r
  • 在 PHP 中将 CSV 写入不带括号的文件

    是否有本机函数或实体类 库用于将数组写入 CSV 文件中的一行而无需封装 fputcsv将默认为 如果没有为封装参数传入任何内容 谷歌让我失望了 返回一大堆有关的页面的结果 fputcsv PEAR 的库做的事情或多或少与fputcsv 工
  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 具有动态表单名称的 form_widget

    在我的 Twig 模板中 我有一个 FOR 循环 它创建多个表单 如下所示 for thing in things set form id myform thing Id set form name attribute form myfor
  • 如何从导出的 csv 文件中删除双引号

    我正在使用 Laravel 5 8 并且添加了 Maatwebsite 包 用于从数据库表导出 CSV 文件 这是我导出的类 class ConfirmedExport implements FromCollection WithHeadi
  • 将函数中的会话变量传递给 codeigniter 中的助手

    这就是我正在尝试做的事情 这是控制器中的功能 public function get started if test login this gt session gt all userdata this gt load gt view te
  • 如何以编程方式获取 WooCommerce 中的所有产品?

    我想获取 WooCommerce 中的所有产品数据 产品 sku 名称 价格 库存数量 可用性等 我可以使用 wp query 来做到这一点吗 这样你就可以通过 wp query 获取所有产品 global wpdb all product
  • 使用 PHP 的 Google Glass GDK 身份验证

    我正在尝试点击此链接来验证 GDK 中的用户 https developers google com glass develop gdk authentication https developers google com glass de
  • PHP 中的 Preg_replace

    我想替换 中包含的字符串中的内容content 它是多行等 preg replace 函数应该删除整个 com 没有垫子 蒙特 尝试这个 result preg replace s replacement content subject
  • 如何将 mysql 转换为 mysqli? [复制]

    这个问题在这里已经有答案了 我厌倦了将 mysql 转换为 mysqli 但似乎收到了很多错误和警告 连接到数据库没有问题 但其余代码似乎错误 我做错了什么 sql
  • Laravel 按动态 ID 数组对集合进行排序 [重复]

    这个问题在这里已经有答案了 我有以下 people array 5 2 9 6 11 people collection People find people 但当我倾倒并死去时 people collection集合按 ID ASC 排序
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 如何用javascript正确读取php cookies

    考虑这个 php 和 javascript 代码 然后我在控制台中看到的是 utma 111872281 291759993 1444771465 1445374822 1445436904 4 utmz 111872281 1444771
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • 在 PHP 中模拟 jQuery.ajax 请求

    我必须在 PHP 中模拟 AJAX 请求 就像在 jQuery 中一样 我当前的代码在这里 原始 AJAX 调用 不得修改 ajax type POST url someFile php data data success function
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • 在 Identity 2.1 中编写自定义 IUserPasswordStore 和 SignInManager.PasswordSignInAsync

    建立自定义IUserPasswordStore连接到旧系统的用户名 密码表 密码是用表中的自定义代码进行哈希处理的 因此我需要编写自定义代码PasswordSignInAsync 我需要覆盖吗PasswordSignInAsync或者我可以
  • 使用 SQL 从日期范围拆分/透视数据

    您好 我对拆分 枢转日期有疑问 这是我的查询 select Name Start End from Employees where Start gt 1 27 2014 and End lt 1 31 2014 样本数据会是这样的 我想要做
  • Sphinx 和 JavaScript 文档工作流程 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于我的 JavaScript 框架 我想使用 Sphinx 由于我是 Sphinx 世界的新手 我希望你们能帮助我开始使用 Sphi
  • Ruby on Rails:如何检测是否通过 JSON 访问?

    我得到了一个调用控制器方法 getInfo 的 GET URL 可以通过 mydomain com getInfo json params BLAHBLAH 或 mydomain com getInfo params BLAHBLAH 调用
  • Objective-C 中的不可变对象:大 init 方法?

    我想要一个 Objective C 中具有不可变字段的对象 在 C 中 我将使用具有私有 setter 和大型构造函数的 Properties 我会在 Objective C 中使用什么 使用 property 似乎不允许我将 setter
  • 获取该月的最后一天? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP 本月最后一天 https stackoverflow com questions 1686724 php last day of the month 有没有类似的功能 date gt getM
  • 如何在 matplotlib 中保存调整为对象大小的图形?

    大家好 我正在尝试保存 matplotlib 中的数字 它保存图形周围的空白 我的意思是它增加了空间 它不保存调整后的对象大小 在 Inkscape 中编辑它们非常容易 我在这个软件中进行编辑 但是当图形超过 50 个时 这就不太好了 我这
  • 为什么 boost::filesystem::path 和 std::filesystem::path 缺少运算符+?

    考虑以下关于路径分解的断言 其中每个局部变量例如stem有明显的初始化 例如auto stem path stem assert root path root name root directory assert path root nam
  • 谷歌地图绘制文物

    在开发我当前的项目时 我正在使用谷歌地图 我在地图上画了一些圆圈 并在缩放或移动地图后在地图上发现了一些伪影 但让我们看一下文档中的官方 Google Maps Circles 演示 谷歌地图圆圈简单 https google develo
  • 为表中的主键随机生成 1-999 之间的唯一数字

    我有一个问题 我不知道如何优雅地解决 背景资料 我有一张小部件表 每个小部件都分配有一个数字范围内的 ID 假设在 1 999 之间 1 999 的值作为 lower range 和 upper range 保存在我的数据库中名为 conf
  • 如何组合这两个 WordPress 搜索查询?

    我有两个搜索查询 人们以默认方式搜索与参数匹配的任何帖子标题 第二个查询设置为搜索帖子元键为 SKU 的任何帖子 就像搜索查询一样 我正在尝试组合这两个查询 以便搜索将返回标题或 sku 与搜索词匹配的任何帖子 第一个查询 args arr
  • Tensorboard 不再显示标量

    我决定更新张量板 因为它没有显示图表 在图表面板上我只能看到一个空白页 没有错误消息 现在我已经更新了图表 这是我的张量板显示的唯一内容 现在我看不到标量或直方图 我有 No scalar data was found 消息 直方图等也是如
  • Apache (EC2) 上的文件上传速度慢于用户的网络上传速度

    我有一个 EC2 实例 运行基本的 LAMP 堆栈作为 Web 服务器 用户可以通过我的网络应用程序上传照片 然后将其存储在目录中并记录在 MySQL 中 通常 这些上传速度与用户的互联网上传速度允许的速度一样快 不幸的是 多个用户报告有时
  • 在 Azure Functions 中将 F# 记录类型返回为 JSON

    我正在 F 中创建一个简单的 azure 函数 最后 我返回 JSON 格式的记录类型 我正在做这样的事情 let y Gender Woman Frequency 17 Percentage 100 0 req CreateRespons
  • 在使用 get 请求的 http 调用时将数组传递到 URLSearchParams

    浏览 WebAPI 文档URL搜索参数 https developer mozilla org en US docs Web API URLSearchParams 我没有找到任何有关将数组作为参数传递的文档 有人可以帮忙吗 事实上 你不能
  • 极坐标比 numpy 慢?

    我正在考虑使用polars代替numpy在一个解析问题中 我将结构化文本文件转换为字符表并对不同的列进行操作 然而 似乎polars大约慢5倍numpy在我执行的大多数操作中 我想知道为什么会出现这种情况以及我是否做错了什么polars应该
  • 依赖 NSUbiquitousKeyValueStore 存储重要数据是否安全?

    我了解到NSUbiquitousKeyValueStore总是可用的 也当没有 iCloud 帐户 https stackoverflow com a 11174855 251760已设置 这让我相信我可以安全地将重要数据存储在其中 而无需
  • 如何让表单和交易在phoenix+ecto中发挥良好?

    我正在玩 Phoenix Ecto 我偶然发现了一些对我来说不习惯的东西 我有一个代表一个表格Invitation 创建邀请函时 我们还需要创建一个User显然我希望两者都发生在一个事务中 这样我就可以保持数据的一致性 在我的表格中我要求n
  • 有没有在 GCP Composer Airflow 上安装私有依赖项的成功案例?

    背景信息 通常在容器环境中 我可以使用以下命令轻松安装我的私有依赖项 requirements txt像这样 index url https user pass some repo jfrog io some repo api pypi p
  • Google 存储桶的签名网址与提供的签名不匹配

    我在使用谷歌存储时遇到了困难 所以我正在尝试做一个签名网址 https cloud google com storage docs access control Signed URLs 已经有客户端 ID 这是一封电子邮件 和私钥 如所述h