基于JWT的Token登录认证

匿名 (未验证) 提交于 2019-12-02 22:11:45

1.JWT简介

2.JWT的原理

{   "用户名": "admin",   "角色": "超级管理员",   "到期时间": "2019-07-13 00:00:00" }

为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

3.JWT的数据结构

实际的 JWT是一个很长的字符串,中间用点(.)分隔成三个部分。 就像下面这样:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjNmMmc1N2E5MmFhIn0.eyJpYXQiOjE1NjI4MzM0MDgsImlzcyI6Imh0dHA6XC9cL3d3dy5weWcuY29tIiwiYXVkIjoiaHR0cDpcL1wvd3d3LnB5Zy5jb20iLCJuYmYiOjE1NjI4MzM0MDcsImV4cCI6MTU2MjkxOTgwOCwianRpIjoiM2YyZzU3YTkyYWEiLCJ1c2VyX2lkIjoxfQ.NFq1qQ-Z5c4pwit8ZkyWEwX6SBXmnHJcc6ZDgSD5nhU

JWT的三个部分依次如下:

- Header(头部) - Payload(负载) - Signature(签名)

4.JWT的使用方式

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面

5.JWT的几个特点

(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。

6.JWT功能实现

composer require lcobucci/jwt 3.3
<?php namespace tools\jwt;  use Lcobucci\JWT\Builder; use Lcobucci\JWT\Parser; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\ValidationData;  /**  * Created by PhpStorm.  * User: asus  * Date: 2019/4/5  * Time: 13:02  */ class Token {     private static $_config = [         'audience' => '',//接收人         'id' => '',//token的唯一标识,这里只是一个简单示例         'sign' => '',//签名密钥         'issuer' => '',//签发人         'expire' => 3600*24 //有效期     ];      //生成token     public static function getToken($user_id){          //签名对象         $signer = new Sha256();         //获取当前时间戳         $time = time();         //设置签发人、接收人、唯一标识、签发时间、立即生效、过期时间、用户id、签名         $token = (new Builder())->issuedBy(self::$_config['issuer'])             ->canOnlyBeUsedBy(self::$_config['audience'])             ->identifiedBy(self::$_config['id'], true)             ->issuedAt($time)             ->canOnlyBeUsedAfter($time-1)             ->expiresAt($time + self::$_config['expire'])             ->with('user_id', $user_id)             ->sign($signer, self::$_config['sign'])             ->getToken();         return (string)$token;     }      //从请求信息中获取token令牌     public static function getRequestToken()     {         if (empty($_SERVER['HTTP_AUTHORIZATION'])) {             return false;         }          $header = $_SERVER['HTTP_AUTHORIZATION'];         $method = 'bearer';         //去除token中可能存在的bearer标识         return trim(str_ireplace($method, '', $header));     }      //从token中获取用户id (包含token的校验)     public static function getUserId($token = null)     {         $user_id = null;          $token = empty($token)?self::getRequestToken():$token;          if (!empty($token)) {             //为了注销token 加以下if判断代码             $delete_token = cache('delete_token') ?: [];             if(in_array($token, $delete_token)){                 //token已被删除(注销)                 return $user_id;             }             $token = (new Parser())->parse((string) $token);             //验证token             $data = new ValidationData();             $data->setIssuer(self::$_config['issuer']);//验证的签发人             $data->setAudience(self::$_config['audience']);//验证的接收人             $data->setId(self::$_config['id']);//验证token标识              if (!$token->validate($data)) {                 //token验证失败                 return $user_id;             }              //验证签名             $signer = new Sha256();             if (!$token->verify($signer, self::$_config['sign'])) {                 //签名验证失败                 return $user_id;             }             //从token中获取用户id             $user_id = $token->getClaim('user_id');         }          return $user_id;     } }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!