1 Cookie
1.1 概念和理解
cookie
常用于识别用户。cookie
是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送cookie
。通过PHP
,您能够创建并取回cookie
的值。
语法:
setcookie(name, value, expire, path, domain);
参数 | 讲解 |
---|---|
name | 必须,cookie 名称 |
value | 必须,cookie 的值 |
expire | 可选,过期时间 |
path | 可选,cookie 的服务器路径。 |
domain | 可选,域名 |
注意: 上述的path
,如果该参数设为‘/‘
的话, cookie
就在整个 domain
内有 效,如果设为 ‘/foo/‘
, cookie
就只在 domain
下的 /foo/
目录及其子目录内有效,例如 /foo/bar/
。默认值为设定 cookie
的当前目录
1.2 Cookie功能
- 记录访客某些信息。可以记录用户访问网页次数,或者用户曾经输入的信息,或者用户上次登录的用户名
- 在页面之间传递变量。当浏览器页面关闭时,所有变量信息随之消失。如果用户声明一个
id=123
,想把这个变量传递到另一个页面,可以用Cookie
将这个变量保存下来,通过下一页通过该Cookie
来获取变量的值
1.3 示例
有以下文件夹目录
cookie.phtml
中设置cookie
<?php
setcookie("user", "testName", time()+3600,"/code/testcookie/");
?>
去同目录下的read.php
去读取cookie
<?php
var_dump($_COOKIE);
?>
运行结果如下
2 Session
PHP session
变量用于存储关于用户会话(session
)的信息,或者更改用户会话(session
)的设置。Session
变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
2.1 开启session
开始 PHP Session
在您把用户信息存储到 PHP session
中之前,首先必须启动会话。
注释:session_start()
函数必须位于 标签之前:
实例
<?php session_start(); ?>
<html>
<body>
</body>
</html>
3 JWT
3.1 概念和理解
首先要明确,JWT
想较于传统Session
的优势在哪里?
session 认证的缺陷在于:
$nbsp;由于 session 是保存在服务器里,所以如果分布式部署应用的话,会出现session不能共享的问题,很难扩展.
所以:什么是JWT
?
JWT (JSON Web Token)
是目前最流行的跨域认证解决方案,是一种基于Token
的认证授权机制。 从JWT
的全称可以看出,JWT
本身也是Token
,一种规范化之后的JSON
结构的Token。
JWT
更符合设计 RESTful API
时的「Stateless
(无状态)」原则 。
3.2 JWT的组成
JWT
由三个部门组成
Header
: 描述 JWT 的元数据,定义了生成签名的算法以及Token
的类型Payload
: 用来存放实际需要传递的数据Signature
(签名) :服务器通过Payload
、Header
和一个密钥(Secret
)使用Header
里面指定的签名算法(默认是HMAC SHA256
)生成
3.2.1 Header
Header
通常由两部分组成:
typ(Type)
:令牌类型,也就是JWT
。alg(Algorithm)
:签名算法,比如HS256
。
示例:
{
"alg": "HS256",
"typ": "JWT"
}
JSON
形式的 Header
被转换成 Base64
编码,成为 JWT
的第一部分。
3.2.2 Payload
Payload
也是 JSON
格式数据,其中包含了 Claims
(声明,包含 JWT
的相关信息)。
Claims
分为三种类型:
Registered Claims
(注册声明) :预定义的一些声明,建议使用,但不是强制性的。Public Claims
(公有声明) :JWT
签发方可以自定义的声明,但是为了避免冲突,应该在IANA JSON Web Token Registryopen in new window
中定义它们。Private Claims
(私有声明) :JWT
签发方因为项目需要而自定义的声明,更符合实际项目场景使用。
常见注声明如下:
iss(issuer)
:JWT
签发方。iat(issued at time)
:JWT
签发时间。sub(subject)
:JWT
主题。aud(audience)
:JWT
接收方。exp(expiration time)
:JWT
的过期时间。nbf(not before time)
:JWT
生效时间,早于该定义的时间的JWT
不能被接受处理。jti(JWT ID)
:JWT
唯一标识。
示例:
{
"uid": "ff1212f5-d8d1-4496-bf41-d2dda73de19a",
"sub": "1234567890",
"name": "John Doe",
"exp": 15323232,
"iat": 1516239022,
"scope": ["admin", "user"]
}
4 插件 php-jwt的使用
4.1 php-jwt介绍
php-jwt
是一个用于生成和验证JSON Web Token
的PHP
库。
4.2 php-jwt的简单实用
4.2.1 创建jwt令牌
$payload
指定了包含在 jwt
中的几个信息,user_id,username,exp
。
jwt
被加密使用$key
制定的密钥,生成jwt可以保存在客户端。
用
JWT::encode
创建jwt
令牌
//需要先引用JET类
use \Firebase\JWT\JWT;
$key = 'example_key';
$payload = array(
"user_id" => 123,
"username" => "john.doe",
"exp" => time()+3600 //过期时间 一小时后过期
);
$jwt = JWT::encode($payload, $key);
//$jwt = JWT::encode($payload, $key, 'HS256');
echo "JWT生成成功".$jwt;
4.2.2 解码jwt令牌
用
JWT::decode
解码jwt
令牌
$jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiJKb2huIERvZSJ9.lU9FdBqKHEMuRifok5OFDJxQVBd-4s8r0gXKG_QnkKY";
$decoded = JWT::decode($jwt,"your_secret_key",array('HS256'));
$decode_array = (array) $decoded;
现在解码后可以使用
if($decode_array["user_id"] == 123){
//code
}else{
//code
}
5 参考文档
[1] 菜鸟教程-cookie/session
[2] JWT理论
[3] jwt官网