aws/aws-php-sns-message-validator

PHP 的 Amazon SNS 消息验证

1.9.0 2023-12-18 17:03 UTC

This package is auto-updated.

Last update: 2024-09-11 15:36:05 UTC


README

@awsforphp on Twitter Total Downloads Build Status Apache 2 License

PHP 的 Amazon SNS 消息验证库 允许您验证传入的 HTTP(S) POST 消息是否为有效的 Amazon SNS 通知。此库是独立的,不依赖于 AWS SDK for PHP 或 Guzzle;但是,它需要 PHP 5.4+ 以及已安装 OpenSSL PHP 扩展。

跳转到

基本用法

要验证消息,您可以使用 Message::fromRawPostData 从 POST 数据中实例化一个 Message 对象。这将从 php://input 读取原始 POST 数据,解码 JSON 数据,并验证消息的类型和结构。

接下来,您必须创建一个 MessageValidator 实例,然后使用 isValid()validate() 方法之一来验证消息。消息验证器会检查 SigningCertURLSignatureVersionSignature 以确保它们有效且与消息数据一致。

<?php

require 'vendor/autoload.php';

use Aws\Sns\Message;
use Aws\Sns\MessageValidator;
 
$message = Message::fromRawPostData();
 
// Validate the message
$validator = new MessageValidator();
if ($validator->isValid($message)) {
   // do something with the message
}

安装

您可以通过 Composer 安装 SNS 消息验证器。

composer require aws/aws-php-sns-message-validator

获取帮助

请使用以下社区资源获取帮助。我们使用 GitHub 问题跟踪错误和功能请求,并且有有限的带宽来处理它们。

关于 Amazon SNS

Amazon Simple Notification Service (Amazon SNS) 是一种快速、全托管的推送消息服务。Amazon SNS 可以将消息发送到电子邮件、移动设备(例如,SMS;iOS、Android 和 FireOS 推送通知)、Amazon SQS 队列,以及当然——HTTP/HTTPS 端点。

使用 Amazon SNS,您可以设置主题以将自定义消息发布到已订阅的端点。然而,SNS 消息被许多其他 AWS 服务用于异步通信有关您的 AWS 资源的信息。一些例子包括

  • 配置 Amazon Glacier 在检索作业完成时通知您。
  • 配置 AWS CloudTrail 在新日志文件已写入时通知您。
  • 配置 Amazon Elastic Transcoder 在转码作业状态更改时(例如,从“正在处理”到“完成”)通知您。

尽管您当然可以将电子邮件地址订阅到这些服务事件的通知以接收 SNS 消息,但您的收件箱会很快被填满。然而,能够订阅一个 HTTP/HTTPS 端点以接收消息却有很大的力量。这允许您为应用程序编写 webhooks 以轻松响应各种事件。

处理消息

确认主题订阅

为了处理 SubscriptionConfirmation 消息,您必须使用传入消息中的 SubscribeURL 值。

use Aws\Sns\Message;
use Aws\Sns\MessageValidator;
use Aws\Sns\Exception\InvalidSnsMessageException;

// Instantiate the Message and Validator
$message = Message::fromRawPostData();
$validator = new MessageValidator();

// Validate the message and log errors if invalid.
try {
   $validator->validate($message);
} catch (InvalidSnsMessageException $e) {
   // Pretend we're not here if the message is invalid.
   http_response_code(404);
   error_log('SNS Message Validation Error: ' . $e->getMessage());
   die();
}

// Check the type of the message and handle the subscription.
if ($message['Type'] === 'SubscriptionConfirmation') {
   // Confirm the subscription by sending a GET request to the SubscribeURL
   file_get_contents($message['SubscribeURL']);
}

接收通知

要接收通知,请使用前面示例中的相同代码,但检查 Notification 消息类型。

if ($message['Type'] === 'Notification') {
   // Do whatever you want with the message body and data.
   echo $message['MessageId'] . ': ' . $message['Message'] . "\n";
}

消息正文将是一个字符串,并包含已发布到 SNS 主题的所有数据。

取消订阅

取消订阅的操作与订阅类似,只是消息类型将是 UnsubscribeConfirmation

if ($message['Type'] === 'UnsubscribeConfirmation') {
    // Unsubscribed in error? You can resubscribe by visiting the endpoint
    // provided as the message's SubscribeURL field.
    file_get_contents($message['SubscribeURL']);
}

本地测试

在 Web 应用程序中使用 webhooks 的一大挑战是测试与服务集成的过程。使用如 ngrokPHP 内置的 Web 服务器 等工具,测试 SNS 通知的集成可以相对简单。我们的一篇博客文章 在本地测试 Amazon SNS 的 Webhooks 展示了测试的一个好方法。

注意:博客文章中的代码示例针对 SDK 版本的 2 中的消息验证器,但可以很容易地适应使用这个版本。

特别感谢

特别感谢 Julian Vidal,他帮助创建了 版本 2 的 AWS SDK for PHP 的初始实现。

贡献

我们努力为 AWS 服务提供高质量和有用的 SDK,我们非常重视社区反馈和贡献。在提交任何问题或拉取请求之前,请先查看我们的 贡献指南,以确保我们拥有所有必要的信息来有效响应您的错误报告或贡献。