如何从Amazon SNS订阅中获取HTTP令牌?

5
如何通过HTTP确认Amazon SNS的订阅? 我目前正在使用Rails开发我的应用程序,并希望收到有关电子邮件退回的通知。因此,我尝试查看Amazon论坛并找到最接近的是:https://forums.aws.amazon.com/thread.jspa?threadID=87555。其中告诉我要使用request.raw_post来获取请求,然后JSON解析它。但是,当我尝试这样做时,它会给我一个错误,说请求为空。我是否正确?有人可以指导我如何从Amazon SNS获取订阅令牌以便我可以确认订阅吗?

1
是的,解析请求正文应该生成一个哈希,其中包含确认令牌等内容。如果您发布一些代码,回答这个问题会更容易。 - benzado
3个回答

5

这对我很有效。在你的控制器中,创建一个类似下面代码的操作。你想要令牌路由,所以你可以在那里看到它。但是我选择了SubscribeURL路由,并只在该URL上执行GET请求。

  def sns
     request_json = JSON.parse(request.raw_post, {symbolize_names: true})
     subscribe_url = request_json[:SubscribeURL]
     token = request_json[:Token]
  end

0

这是一个对我有效的PHP脚本。(有一些日志行将其写入/tmp/log.txt文件,以帮助调试发生了什么。首先,我从https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem下载了亚马逊证书。还要确保在任何地方都使用utf8。

对我来说,它只能使用http工作。当我订阅https网址时,我看不到服务器中的任何访问。

<?php

mLog ("\n\n----------------Start Receive -------------\n");

require_once APP_DIR . 'util/AWSSDKforPHP/sdk.class.php';

$h= fopen("php://input","r");
$X = stream_get_contents($h);


$J = json_decode( $X , true);

mLog("Received body: \n" . json_encode($J). "\n");

function mLog($Msg) {
    file_put_contents(sys_get_temp_dir() .'/log.txt',$Msg,FILE_APPEND);
}


function CheckCall($J) {

    if ($J["Type"]=="Notification") {
        $SB='';
        $SB .= "Message\n";
        $SB .= $J["Message"] . "\n";
        $SB .= "MessageId\n";
        $SB .= $J["MessageId"] . "\n";

        if ($J["Subject"] != null) {
            $SB .= "Subject\n";
            $SB .= $J["Subject"]. "\n";
        }

        $SB .= "Timestamp\n";
        $SB .= $J["Timestamp"] . "\n";

        $SB .="TopicArn\n";
        $SB .= $J["TopicArn"]."\n";
        $SB .="Type\n";
        $SB .=$J["Type"]."\n";

    } else if ($J["Type"]=="SubscriptionConfirmation") {
        $SB='';
        $SB .= "Message\n";
        $SB .= $J["Message"] . "\n";
        $SB .= "MessageId\n";
        $SB .= $J["MessageId"] . "\n";
        $SB .= "SubscribeURL\n";
        $SB .= $J["SubscribeURL"] . "\n";
        $SB .= "Timestamp\n";
        $SB .= $J["Timestamp"] . "\n";

        $SB .= "Token\n";
        $SB .= $J["Token"] ."\n";
        $SB .="TopicArn\n";
        $SB .= $J["TopicArn"]."\n";
        $SB .="Type\n";
        $SB .=$J["Type"]."\n";
    } else {
        $SB='';
    }


    $cert = file_get_contents('SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem');
    $pubkey_id = openssl_get_publickey($cert);

    mLog("Signed string:\n" . $SB . "End Signed string\n");

    $Sig=base64_decode($J["Signature"]);
    if ( openssl_verify($SB, $Sig, $pubkey_id)) {
        return true;
    } else {

        return false;
    }
}

if (!CheckCall($J)) {
    mLog("Authorization failed. \n");
    header('HTTP/1.1 500 Internal Server Error');
    echo "<html><head></head><body>".sys_get_temp_dir()."</body></html>";

    exit(0);
}

$sns = new AmazonSNS();

if ($J["Type"]=="SubscriptionConfirmation") {
    $Res = $sns->confirm_subscription($J["TopicArn"], $J["Token"]);
    mLog("confitm_subscription sended: \n" . json_encode($Res));
} else if ($J["Type"]=="Notification") {
    mLog("-----------Begin Message-----------\n");
    mLog("Subject: ".$J["Subject"]. "\n");
    mLog($J["Message"]);
    mLog("\n-----------End Messagr------------\n\n");

} else {
    mLog("Invalid type \n");
}
echo "<html><head></head><body>Authentication Error</body></html>";

-1

使用PHP:

您可以通过file_get_contents('php://input');获取数据。

您将会收到类似于以下的JSON结构:

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "4..050670318",
  "Token" : "2336412f37fb687f5d51e6e2425f00....",
  "TopicArn" : "arn:aws:sns......",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-east-1:430......\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-....&Token=2336412f37fb687f5d51e6e2425f004aef17b3ebbd98e122....",
  "Timestamp" : "2020-06-30T14:31:43.953Z",
  "SignatureVersion" : "1",
  "Signature" : "i3zpoQ3mAbcxTr18m/z5PL9Ls...",
  "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/..."
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接