再见PHP Sessions,hello JSON标记(例子)

・2 分钟阅读

REST是用于无状态的API ,这意味着来自客户机的每个请求都应该包含处理请求所需的所有信息,换句话说,如果在PHP中编写REST API,那么你不应该使用$_SESSION来存储关于客户端会话的数据,但是,我们要如何记住客户机是登录的还是其他的状态? 唯一的可能是客户端必须负责跟踪状态,怎么能安全地做到? 因为无法信任客户端!

输入JSON Web令牌。 JSON Web令牌有点像JSON,可能是这样的:


{
"user":"alice",
"email":"test@nospam.com"
}

当然,我们不能就这样把它交给客户,让他们把它还给我们,而不保证它没有被篡改。毕竟,如果他们按如下方式编辑标记:


{
"user":"administrator",
"email":"test@nospam.com"
}

解决方案是JSON Web令牌由服务器签名。如果客户机篡改了数据,那么令牌的签名将不再匹配,并且引发错误。

JWT PHP类使得这很容易做到,例如,要在客户端成功登录后创建令牌,可以使用以下代码:


$token = array();
$token['id'] = $id;
echo JWT::encode($token, 'secret_server_key');

然后在以后的API调用中,该代码可以检索,并且验证令牌:


$token = JWT::decode($_POST['token'], 'secret_server_key');
echo $token->id;

如果令牌被篡改,那么$token将是空的,没有可用的标识,JWT类确保永远不会提供无效数据。如果令牌被篡改,那么这个令牌将不可用,非常简单的东西!

您可以将PHP JWT类作为单个文件从以下位置获取:https://github.com/rmcdaniel/angular-codeigniter-seed/blob/master/api/application/helpers/jwt_helper.php

它被AngularJS的CodeIgniter种子项目使用:

https://github.com/rmcdaniel/angular-codeigniter-seed

或者原始代码来自:

https://github.com/luciferous/jwt

方玉 profile image