2015-06-20 69 views
2

我有一个休息服务,我的网站称之为休息服务,我希望尽可能避免在我的网站外打电话。PHP:使用带有时间戳的令牌来保护休息服务

我想创建一个与时间戳混合的令牌,因此用户只能在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)服务器:如果与令牌混合的时间参数不等于10分钟的令牌,该请求是无效的:

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

的问题:

1)这是塞纳里奥还行吗?如果是,那么确切的解决方案是什么?如果否,那么解决方案是什么?

2)还有一种塞纳里奥保证,我已经看到在AWS的要求:http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
我如何在PHP中实现这一点?

回答

0

从客户端获得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); 
} 
  • 保存生成器数据库中的时间戳和时间戳,并从客户端获取令牌后检查相应的时间戳。