Composer 使用 JWT 生成 TOKEN 实例

Composer使用JWT组件生成Toekn实例

1、Token和Session的区别?

SESSION 是服务器通过 Key-Value 对来保存数据的一种机制,比如 APP 的登录状态可以用 SESSION 来保存。
TOKEN 翻译过来叫令牌,令牌是什么意思?可以拿现实中的令牌对比,现实中的令牌起到通行证的作用,而这在服务端也是一样的。我们在登录后,服务端使用 SESSION 保存我们的登录状态,并把 SESSION 的 Key 返回给客户端,那么这个 Key 就成为我们的令牌(TOKEN),我们以后再访问数据,就直接把这个 TOKEN 随着请求一起发送给服务端,这样服务端通过这个 TOKEN 在 SESSION 中查找数据,如果有就说明 TOKEN 有效(就像你去旅游,关口认可你的通行证),并取出你的登录数据,利用你的用户信息(保存在登录数据内)查出你想要的内容。

2、APP为什么使用Token而不使用Session

相较于Session而言,每一次的会话操作都会对服务器造成压力。
Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

3、Token在与客户端交互流程

1:客户端通过用户名和密码登录
2:服务器验证用户名和密码,若通过,生成token返回给客户端。
3:客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了
4:服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性(为什么能验证下面说)。
注:若该token合法,则通过请求,若token不合法或者过期,返回请求失败。

4、如何来生成Token 使用composer加载包lcobucci/jwt

composer require lcobucci/jwt 

5、Token的格式

分为请求头 heard

{
  "alg": "HS256",
  "typ": "JWT"
}

保存的内容

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

加盐字符串

6、下面使用PHP来创建Token

<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
use \Exception;

class Token
{
    /**
     * 创建Token
     * @param $uid 需要保存的用户身份标识
     * @return String
    **/
    public static function createToken($uid = null) 
    {
        $signer = new Sha256();
        $token = (new Builder())->setIssuer('https://www.baidu.com')
            ->setAudience('httpsp://www.baidu.com')
            ->setId('sxs-4f1g23a12aa', true) //自定义标识
            ->setIssuedAt(time()) //当前时间
            ->setExpiration(time() + (86400 * 30)) //token有效期时长
            ->set('uid', $uid)
            ->sign($signer, '你的加盐字符串')
            ->getToken();
            //这里可以做一些其它的操作,例如把Token放入到Redis内存里面缓存起来。
            /** 
             * ......
             * ......
            **/ 
        return (String) $token;     
    }

    /**
     * 检测Token是否过期与篡改
     * @param token
     * @return boolean
    **/
    public static function validateToken($tokan = null) 
    {
        $token = (new Parser())->parse((String) $tokan);
        $signer =  new Sha256();
        if (!$token->verify($signer, '创建时候的加盐字符串')) {
            return false; //签名不正确
        }

        $validationData = new ValidationData();
        $validationData->setIssuer('https://www.baidu.com');
        $validationData->setAudience('https://www.baidu.com');
        $validatationData->setId('sxs-4f1g23a12aa');//自字义标识

        return $token->validate($validationData);
    }
}

TokenController调用实现

Class TokenController
{   
    public function create()
    {

        $token = Token::createToken(1);     
        var_dump($token);
    }

    public function validate($token)
    {
        $bool = Token::validateToken($token);
        var_dump($bool);
    }
}

以上就是使用过程,希望能对你有所帮助。欢迎留言讨论

本作品采用《CC 协议》,转载必须注明作者和本文链接
994914376
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

生成的token是保存在哪儿的

4年前 评论
994914376

@yavana 这个是你自己保存的,可以存文件,数据库,缓存

4年前 评论

怎么删除token 实现logout的功能?

4年前 评论
994914376

@sde_wang 直接把保存的token值给删除掉就可以了,这样前端传过来的值你后端是没有的

4年前 评论

多个请求,有一个刷新了token,其他的请求都没法通过验证怎么办?

3年前 评论

file 老哥 token 不是 toekn

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!