使用composer构建自己的php框架(fizzday)

【Fizzday06】使用JWT前后端分离认证

2017-07-31  本文已影响9773人  fizzday

先睹为快

<?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

同时可运用到任何地方, 不局限于本框架

上一篇下一篇

猜你喜欢

热点阅读