【问题标题】:Gigya PHP Sdk - Comment NotificationsGigya PHP Sdk - 评论通知
【发布时间】:2015-04-15 06:50:45
【问题描述】:

我正在尝试使用 Gigya 的评论通知功能,并遵循以下指南: http://developers.gigya.com/010_Developer_Guide/18_Plugins/022_Comments_Version_2/Comment_Notifications

我开发了以下代码:

<?php

    require_once('GSSDK.php');

    $event = $_POST['event'];
    $eventData = $_POST['eventData'];
    $nonce = $_POST['nonce'];
    $timestamp = $_POST['timestamp'];
    $signature = $_POST['signature'];
    $signatureBase = sprintf("%s_%s_%s_%s", $event, $eventData, $nonce, $timestamp);
    $expectedSignature = SigUtils::calcSignature(
        $signatureBase,
        MY_SECRET_KEY);

    if($signature !== $expectedSignature) {
        header('HTTP/1.0 403 Forbidden');
        die();
    }

    //Some other stuff
    exit();

?>

但它永远不会到达“//其他一些东西”部分。 预期的签名总是与 Gigya 服务器提供的签名不同。 我做错了什么?

【问题讨论】:

    标签: php sdk comments hmacsha1 gigya


    【解决方案1】:

    试试下面的代码:

    <?php
    
      static function calcSignature($baseString,$key)
      {
        $baseString = utf8_encode($baseString);
        $rawHmac = hash_hmac("sha1", utf8_encode($baseString), base64_decode($key), true);
        $sig = base64_encode($rawHmac); 
        return $sig;
      }
    
      function checkSignature() 
      {
        $event = $_POST["event"];
        $eventData = $_POST["eventData"];
        $nonce = $_POST["nonce"];
        $timestamp = $_POST["timestamp"];
        $signature = $_POST["signature"];
    
        $signatureBase = $event . "_" . $eventData . "_" . $nonce . "_" . $timestamp;
        $secret = "[your gigya secret key]";
        $expectedSignature = calcSignature($signatureBase, $secret);        
    
        // Now compare the expectedSignature value to the signature value returned in the callback
        if ($signature !== $expectedSignature) 
        {
          header('HTTP/1.0 403 Forbidden');
          die();
        }
      }
    
      checkSignature();
      //Some other stuff
      exit();
    ?>
    

    此代码删除了对 GigyaSDK 的依赖,只是为了检查签名。提供的方法与 GigyaSDK 使用的方法相同,但这里的优点是内存占用要小得多,因为不需要加载整个 GigyaSDK。

    另外,我不确定是不是故意的,但你的比较有代码:

    if(!$signature !== $expectedSignature) {
    

    代替:

    if ($signature !== $expectedSignature) {
    

    我不太确定 $signature 上的无关逻辑非运算符的目的是什么,但这似乎会导致意外行为。

    【讨论】:

    • Jay,我已经测试了您的解决方案,但无法正常工作。有效负载来自 $_POST vars,$_GET 中没有任何内容。是的,(!$signature !== 确实是一个拼写错误。我已经在参考代码中修复了它,但仍然无法正常工作。 calcSignature 生成的签名与来自请求的签名不同(POST 字段“签名”)
    • 如果您允许,我可以通过电子邮件将我收到的最后一个有效负载发送给您,您可以检查一下。我也需要你的电子邮件:)
    • 我已经更新了上面提供的答案,将其改回 $_POST,我们的文档与过去的工作方式之间存在脱节。以前,这些数据是在 $_GET 有效负载中提供的,并且据记载它以这种方式工作。正如您所指出的,文档不正确,它应该是 $_POST 而不是 $_GET。
    • 作为附加说明,请检查您的 Gigya 合作伙伴密钥——它必须是合作伙伴级别的密钥,而不是应用程序或用户密钥。在上面的代码中,您应该更改:$secret = "[your gigya secret key]";,使其看起来像 $secret = "qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxI=";
    • 我测试了一遍又一遍。并且使用邮件支持提供的一些代码,我能够找到问题所在。看起来我们的服务器正在将“+”字符作为 POST 传递的签名中的空格进行 url 解码。我终于通过在“提供的签名”($_POST[“signature”])的值上应用一些字符串替换方法来实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多