PHP:使用与时间戳混合的令牌保护 Rest 服务

PHP: Secure a Rest Service with a Token mixed with Timestamp

我有一个我的网站调用它的休息服务,我想确保它尽可能不在我的网站外部调用。

我想创建一个混合时间戳的令牌,这样用户只能在 10 分钟(例如)内使用服务器中生成的令牌调用服务。

让我用一些伪代码来解释一下:

1) 服务器: 令牌是在服务器中使用私钥和时间戳生成的:

// The token is valid only for 10 minutes after 'time'
$token = encrypt($pKey, timestamp); // Server Time

2) 客户端: 我们将令牌放在 javascript 变量中,并在我们的请求中使用它和客户端的时间戳:

var token = '<?= $token ?>';
var params = {
  token : token,
  time  : timestamp, // Client Time
  data  : mydata
}

3)服务器:如果时间参数混入token不等于10分钟token,则请求无效:

// I'm Stuck Here
$something = decrypt($pKey, $_POST['token'], $_POST['time']);
if ($something != $tenMinutes) { // Invalid Request }

问题:

1)这是senarioO.K吗?如果是,确切的解决方案是什么?如果否,那么解决方案是什么?

2) 还有另一个 senario 来保护我在 AWS 中看到的请求:http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
如何在 PHP 中实现它?

从客户端获得 token 后,您需要检查两件事:令牌的有效性及其时间戳。

有两种情况:

  1. 使timestamp成为令牌的一部分:

    function getToken($timestamp) {
        return $timestamp . encrypt(getPKey(), $timestamp);
    }
    
    $token = genToken(time());
    

然后验证它:

$token = $_POST['token']; 

function validate($token) {
    $timestamp = substr($token, 0, 10);
    return 
        (genToken($timestamp) == $token)
        && ($timestamp >= time() - 600);
}
  1. 将生成的令牌连同时间戳一起保存在数据库中,并在从客户端获取令牌后检查相应的时间戳。