如何通过http确认Amazon SNS的订阅?我目前正在为我的应用程序使用Rails,并希望收到有关我的电子邮件退回的通知。所以,我尝试浏览亚马逊论坛,我找到的最接近的是:https://forums.aws.amazon.com/thread.jspa?threadID=87555告诉我使用request.raw_post获取请求,JSON解析它。但是,当我尝试这样做时,它给我一个错误,说请求是空的。我是以正确的方式做到的吗?有人可以指导我如何从Amazon SNS获取订阅令牌,以便我可以确认我的订阅吗?谢谢! :)
答案 0 :(得分:1)
这对我有用。在您的控制器中,创建一个类似下面代码的操作。你想要令牌路线,所以你可以在那里看到它。但我选择了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
答案 1 :(得分:0)
这是一个适用于我的php scrit。 (有一些日志行将其写入文件i /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>";
答案 2 :(得分:-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/..."
}