如何用 PHP 计算 AWS 签名?

2023-12-27

我正在 bref 中编写一个 webhook,并希望它向 SQS 发送消息。为此使用整个 AWS SDK 是一种巨大的浪费。我如何计算签名?


const AWS_DATETIME_FORMAT = 'Ymd\THis\Z';

$url = getenv('SQS_URL');
$data = [
  'Action' => 'SendMessage',
  'MessageBody' => $body,
  'Expires' => (new DateTime('UTC'))->add(new DateInterval('PT1M'))->format(AWS_DATETIME_FORMAT),
  'Version' => '2012-11-05',
];
$result = Requests::post($url, sign_request($url, $data), $data);

function sign_request($url, $data) {
  // These values are provided by AWS Lambda itself.
  $secret_key = getenv('AWS_SECRET_ACCESS_KEY');
  $access_key = getenv('AWS_ACCESS_KEY_ID');
  $token = getenv('AWS_SESSION_TOKEN');
  $region =  getenv('AWS_REGION');

  $service = 'sqs';

  $current = new DateTime('UTC');
  $current_date_time = $current->format(AWS_DATETIME_FORMAT);
  $current_date = $current->format('Ymd');

  $signed_headers = [
    'content-type' => 'application/x-www-form-urlencoded',
    'host' => "sqs.$region.amazonaws.com",
    'x-amz-date' => $current_date_time,
    'x-amz-security-token' => $token, // leave this one out if you have a IAM created fixed access key - secret pair and do not need the token.
  ];
  $signed_headers_string = implode(';', array_keys($signed_headers));

  $canonical = [
    'POST',
    parse_url($url, PHP_URL_PATH),
    '', // this would be the query string but we do not have one.
  ];
  foreach ($signed_headers as $header => $value) {
    $canonical[] = "$header:$value";
  }
  $canonical[] = ''; // this is always an empty line
  $canonical[] = $signed_headers_string;
  $canonical[] = hash('sha256', http_build_query($data));
  $canonical = implode("\n", $canonical);

  $credential_scope = [$current_date, $region, $service, 'aws4_request'];
  $key = array_reduce($credential_scope, fn ($key, $credential) => hash_hmac('sha256', $credential, $key, TRUE), 'AWS4' . $secret_key);
  $credential_scope = implode('/', $credential_scope);

  $string_to_sign = implode("\n", [
    'AWS4-HMAC-SHA256',
    $current_date_time,
    $credential_scope,
    hash('sha256', $canonical),
  ]);
  $signature = hash_hmac('sha256', $string_to_sign, $key);

  unset($signed_headers['host']);
  $signed_headers['Authorization'] = "AWS4-HMAC-SHA256 Credential=$access_key/$credential_scope, SignedHeaders=$signed_headers_string, Signature=$signature";
  return $signed_headers;
}

请注意此代码正在使用rmccue/requests执行 POST 请求。

My serverless.yml好像:

provider:
  name: aws
  region: us-east-1
  runtime: provided.al2
  environment:
    SQS_URL: !Ref BadgeQueue

resources:
  Resources:
    BadgeQueue:
      Type: AWS::SQS::Queue
      Properties:
        RedrivePolicy:
          maxReceiveCount: 3
          deadLetterTargetArn: !GetAtt BadgeDeadLetterQueue.Arn
    BadgeDeadLetterQueue:
      Type: AWS::SQS::Queue
      Properties:
        MessageRetentionPeriod: 1209600
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 PHP 计算 AWS 签名? 的相关文章

  • 如何修复 Laravel 中未找到的“PDF”类

    在我的 Laravel 应用程序中遇到以下错误 CollaboPDFController php 第 14 行中的 FatalErrorException 未找到 PDF 类 这是我的ColaboPDFController php
  • C++ 相当于 PHP 的 pack()

    我的问题很简单 有没有类似 PHP 的pack and unpack C STL 中的函数 如果没有 是否有其他方法可以实现相同的目标 https www php net pack https www php net pack Thanks
  • 加密安全随机数生成器如何工作?

    我了解标准随机数生成器的工作原理 但在使用密码学时 随机数确实必须是随机的 我知道有一些仪器可以读取宇宙白噪声 http en wikipedia org wiki Hardware random number generator帮助生成安
  • 理想的 PHP 会话大小?

    我有一个 PHP 表单 抵押应用程序 大约有 400 个字段 该网站的流量会很低 对于进入 MySQL 数据库的 400 个字段 理想的会话大小是多少 In php ini我要设置什么 我应该设置我缺少的任何内容吗 会话的大小没有限制 但
  • WordPress 安装中发现的恶意 PHP 代码有什么作用?

    我能够解码在一些 WordPress 文件中找到的以下 PHP 脚本 只是出于好奇 有人可以告诉我这段代码实际上是做什么的吗 看起来它已经以某种方式复制到同一服务器上的其他 WordPress 安装中
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • filter_input() 何时删除 POST 变量的斜杠?

    我创建了一个小型 PHP 脚本 它在 PHP 5 2 17 的服务器上运行magic quotes gpc指令已启用 我没有对 php ini 文件的写访问权限 并且我想从用户输入中删除所有斜杠 即使magic quotes gpc指令被关
  • 正确的标头 php mysql blob 显示图像

    我正在尝试在我的 PHP 页面中显示来自 mysql blob 的图像 我知道这不是最佳实践 然后我会将其引入我的 iOS 应用程序中 我在设置页面标题时遇到问题 我认为需要将其设置为图像 所以 这显示了图像 但我不相信页眉是正确的 hea
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • PHP 中的抽象类是什么?

    PHP 中的抽象类是什么 如何使用 抽象类是至少包含一个抽象方法的类 该方法中没有任何实际代码 只有名称和参数 并且已被标记为 抽象 这样做的目的是提供一种模板来继承并强制继承类实现抽象方法 因此 抽象类是介于常规类和纯接口之间的东西 此外
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • Opencart 的 $this->config->get('module_var_name')

    我正在尝试自定义 Opencart 支付模块 我看到很多地方都使用了配置信息 但我找不到任何创建正在使用的变量的内容 我知道在管理页面中 如果我选择 paypal 标准 我可以设置所有 配置 信息 但我找不到强调它的 模型 是否有模型 我希
  • 使用php插入sql数据库时出错

    我有一个带有 MySQL 插入查询的程序 sql INSERT INTO people person id name username password email salt VALUES person id name username p
  • PHP别名@函数

    我是 PHP 新手 看到一些使用 前缀调用函数 如 mysql ping 的示例 我感到很困惑 它是做什么用的 谷歌搜索 搜索没有太大帮助 因为 被丢弃并且 别名 不是足够好的关键字 抑制错误 警告和通知 如果你用自定义的方式补充它 你可以
  • 扫描 PHP 上传的病毒

    我目前正在使用以下代码来扫描作为申请表的一部分上传的文件 safe path escapeshellarg dir file command usr bin clamscan stdout safe path out int 1 exec
  • 在 PHP 中使用数组来比较用户名/密码

    我有以下 php 脚本 其中有一个用户名和密码 Username user1 Password pass1 if isset POST submitform Clean up the input values foreach POST as
  • 我应该使用排队系统来处理付款吗?

    我在用着Slim https www slimframework com和这个结合Stripe 的 PHP 库 https stripe com docs api php在我的应用程序中处理付款 一切都很好 但是直到最近 我在我的系统中发现
  • 推送到 ECR 存储库的图像达到最大数量后会发生什么

    根据Amazon ECR 服务限制 http docs aws amazon com AmazonECR latest userguide service limits html 每个存储库的最大图像数量为 1 000 超过此限制后 最旧的
  • 使用 html5 分块上传文件

    我正在尝试使用 html5 的文件 API 分块上传文件 然后在服务器端用 php 重新组装它 我正在上传视频 但是当我在服务器端合并文件时 大小增加了 并且它变成了无效文件 请注意 以下 html5 代码仅适用于 chrome 浏览器 在
  • 如何在 PHP >= 5.3 严格模式下向对象添加属性而不产生错误

    这必须很简单 但我似乎找不到答案 我有一个通用的 stdClass 对象 foo没有属性 我想添加一个新属性 bar尚未定义 如果我这样做 foo new StdClass foo gt bar 1234 严格模式下的 PHP 会抱怨 将属

随机推荐

  • 运行全新安装的 iPython 时出错

    我正在使用 virtualenvwrapper 因此任何人都可以轻松地重现它 但是使用也会发生这种情况pip直接在我的系统上 安装 iPython 后pip 我将无法运行它 注意我使用的是 Python 2 解释器 尽管如果我使用 Pyth
  • 在 iOS9 上编辑 UITextField 时向上移动键盘

    让我的键盘向上移动以发现UITextField在我的 iOS 应用程序中 我曾经实现过这个答案 https stackoverflow com a 6908258 3855618 https stackoverflow com a 6908
  • 无法将文本视图的文本垂直居中

    已解决 我必须添加android fillViewport true 到 ScrollView 解决了文本不垂直居中的问题 我知道这个问题之前已经被回答过很多次了 但我仍然无法将文本视图的文本垂直居中
  • Amazon EC2 作为网络服务器? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近对可用的不同托管类型进行了很多思考 我们可以从欧洲的 EC2 实例 我们位于瑞典 获得相当不错的延迟 平均 并且成本相当不错 显然 扩大和
  • 访问 Ember-CLI 嵌套控制器

    这是我的目录结构 controllers restaurant items js index js restaurant js 我的路由器声明 this route restaurants path restaurants this res
  • 快速生成随机集,蒙特卡罗模拟

    我有一组大约 100 个数字 我希望对这组数字执行 MC 模拟 基本思想是我完全随机化该组 对前大约 20 个值进行一些比较 检查 存储结果并重复 现在 实际的比较 检查算法非常快 它实际上在大约 50 个 CPU 周期内完成 考虑到这一点
  • 当客户端关闭与 Django/WSGI 应用程序的连接时,如何防止“IOError:无法写入数据”?

    我有一个 iPhone 应用程序 它使用 Python Django 和 Piston 实现的 Web 服务 通过 WSGI 在 apache 服务器上运行 有时 应用程序会在呼叫完成之前关闭与服务器的连接 当它这样做时 会导致 Tue S
  • 在Python中对字母数字字典键进行排序[重复]

    这个问题在这里已经有答案了 我有一个键字典 如 A1 A15 B1 B15 等 运行dictionary keys sort 会产生 A1 A10 A11 def sort keys dictionary keys dictionary k
  • 通过 jquery geocoder.geocode 进行地址地理编码(400 项)

    我正在尝试解析包含 400 个地址的 json 并在每个位置设置地图图标 我的问题是 当我循环遍历项目时 出现错误 OVER QUERY LIMIT 但是使用 google geocode api 设置位置的最佳方法是什么 我的函数如下所示
  • 单击 URL 将打开默认浏览器

    我已经在我的中加载了一个外部URLWebView 现在我需要的是 当用户单击加载的页面上的链接时 它必须像普通浏览器一样工作并在相同的位置打开链接WebView 但它打开默认浏览器并加载页面 我已经启用了 JavaScript 但它仍然不起
  • 带有 android:autoVerify="true" 的意图过滤器 - 安装时从未验证,默认应用程序链接不起作用

    我在 Android 应用程序中使用branch io SDK 并希望使我的应用程序成为 Android 6 上分支链接的默认处理程序 如下所述here http developer android com training app lin
  • Java 库类的源代码

    在哪里可以找到 Java 库类的源代码 我的意思是课程rt jar 平台 Windows 对于具有单独 JRE 和 JDK 下载的旧版本 Java 请下载 JDK 公共类的源代码位于 src zip 中
  • 计算列中值的频率[重复]

    这个问题在这里已经有答案了 我有不同项目的数据 这些项目的路径 A E 和可能性 不太可能 可能 或 可能 数据如下所示 但有更多项目 因此有更多行 Project Pathway Likelihood 1 Red A unlikely 2
  • 使用 Ghostscript 将 PDF 转换为 PostScript:大文件打印时出现问题

    我目前正在使用 Ghostscript 将 500 页 PDF 文件转换为 PostScript 我使用的是 Windows 7 Ghostscript x64 v 9 16 和柯达 Digimaster 商业打印机 我使用 GhostSc
  • Firestore 复合查询 <= & >=

    我需要查询 firestore 集合中开始时间 是一个数字 为的条目 gt slot start和和 lt slot end 像这样 collection Entries ref gt ref where timeStart gt slot
  • 无法模拟 API 请求

    设置起来非常困难开玩笑测试模拟 https github com jefflau jest fetch mock在我的 TypeScript 项目中 我想知道是否有人可以指出我正确的方向 我有一个看起来像这样的函数 检索数据 ts impo
  • postgresql:如何获取通过批量 copy_from 插入的行的主键?

    目标是这样的 我有一组值要放入表中A 以及一组要放入表中的值B 进入的值B参考值在A 通过外键 所以插入后A值我需要知道如何在插入时引用它们B价值观 我需要这个尽可能快 我做了B通过批量复制插入值 def bulk insert copyf
  • Java简单网络IP地址扫描器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想制作自己的 ip 扫描器 扫描本地网络上的可用 ip 就像 Angry IP Scanner 那样 我还想获取一些基本的设备信息
  • Rails 中同一个类的多个关联的最佳实践?

    我认为我的问题最好作为一个例子来描述 假设我有一个名为 Thing 的简单模型 它有一些简单数据类型的属性 就像是 Thing foo string goo string bar int 这并不难 db 表将包含具有这三个属性的三列 我可以
  • 如何用 PHP 计算 AWS 签名?

    我正在 bref 中编写一个 webhook 并希望它向 SQS 发送消息 为此使用整个 AWS SDK 是一种巨大的浪费 我如何计算签名 const AWS DATETIME FORMAT Ymd THis Z url getenv SQ