先睹为快
<?php
use Fizzday\FizzJWT\FizzJWT;
$key = 'secret str';
$payload = [
"iss"=>"fizzday.net",
"exp": 1300819380,
"name"=>"fizz",
"admin"=>true
];
// 生成认证token
$token = FizzJWT::encode($payload, $key);
// 解析token
$payload = FizzJWT::decode($token, $key);
没错, 这是一个对称加密的token, 只需要通过token就知道用户信息了, 同时, 也不怕其他人伪造token, 因为, 私钥(key)是在服务器上的, 只要key不泄露出去, 就是安全的
我们只需要通过token解析就知道用户的基本信息了, 从而完成无状态认证, 源代码在最后. 下边科普一下 JWT 的基本知识
概念
现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证。它有以下特点:
JWT是跨不同语言的,JWT可以在 .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript和Haskell中使用
JWT是自我包涵的,它们包含了必要的所有信息,这就意味着JWT能够传递关于它自己的基本信息,比如用户信息和签名等。
JWT传递是容易的,因为JWT是自我包涵,它们能被完美用在HTTP头部中,当需要授权API时,你只要通过URL一起传送它既可。
JWT易于辨识,是三段由小数点组成的字符串:
aaaaaaaaaa.bbbbbbbbbbb.cccccccccccc
这三部分含义分别是header,payload, signature
1. Header
头部包含了两个方面:类型和使用的哈希算法(如HMAC SHA256):
{
"typ": "JWT",
"alg": "HS256"
}
对这个JSON字符进行base64encode编码,我们就有了首个JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2. Payload
JWT的第二部分是payload,也称为 JWT Claims,这里放置的是我们需要传输的信息,有多个项目如注册的claim名称,公共claim名称和私有claim名称。
注册claim名称有下面几个部分:
iss: token的发行者
sub: token的题目
aud: token的客户
exp: 经常使用的,以数字时间定义失效期,也就是当前时间以后的某个时间本token失效。
nbf: 定义在此时间之前,JWT不会接受处理。
iat: JWT发布时间,能用于决定JWT年龄
jti: JWT唯一标识. 能用于防止 JWT重复使用,一次只用一个token
公共claim名称用于定义我们自己创造的信息,比如用户信息和其他重要信息。
私有claim名称用于发布者和消费者都同意以私有的方式使用claim名称。
下面是JWT的一个案例:
{
"iss": "scotch.io",
"exp": 1300819380,
"name": "Chris Sevilleja",
"admin": true
}
3. 签名
JWT第三部分最后是签名,签名由以下组件组成:
header
payload
密钥
下面是我们如何得到JWT的第三部分:
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); HMACSHA256(encodedString, 'secret');
这里的secret是被服务器签名,我们服务器能够验证存在的token并签名新的token。
php封装类
FizzJWT源码: https://github.com/fizzday/FizzJWT
同时可运用到任何地方, 不局限于本框架