精华内容
下载资源
问答
  • 2021-09-01 18:27:58

    Jwt token生成的方式有几种,可根据具体情况决定生成方式,以下为本人使用的一种,仅供参考。JWT官网链接

    1.jwt生成的Token格式

    eyJhbGciOiJIUzI1NiJ9.eyJqd3RDbGFpbSI6eyJ1c2VySWQiOiIyIiwiYXBpSWRzIjoiMSwyLDMiLCJuYW1lIjpudWxsfSwiaWF0IjoxNjMwNDg3MjA5LCJleHAiOjE2MzA0OTQ0MDl9.apV5AqF6tgeVOcZZgHztsoGVCsv8b-M3ipExC6E7eUE

    2.jwt生成Token的结构

            2.1 jwt生成的token由三部分组成

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

                    格式为:Header.PayLoad.Signature (中间由符号“.”链接)与生成的token相对应

            2.2 Header

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

                alg表示签名的算法,默认为SHA256,写作“HS256”,typ表示令牌的类型,JWT统一为“JWT“

            2.3 Payload

            Payload官方名称为负载,用来存放实际需要存放的数据,官方给出了7个参考字段,也可以自定义参数,在这里需要注意的是这部分是json对象根据Base64转化而成,不进行加密,所以需要注意不要存储私密信息。

    //官方推荐参数
    iss (issuer):签发人
    exp (expiration time):过期时间
    sub (subject):主题
    aud (audience):受众
    nbf (Not Before):生效时间
    iat (Issued At):签发时间
    jti (JWT ID):编号

            2.4 Signature

            Signature是由HeaderPayload根据密钥(secret自行设置)以及指定的加密方式生成

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    

    3.jwt token生成

            3.1 引入jar

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version> 3.10.0</version>
    </dependency>

            3.2 生成,解析Token

            token生成我使用了两种方式,最终采用了第一种,原因是更简洁,和自定义数据存取方便,大家在使用时可以根据自己情况使用。

    public class JwtUtils {
    
        public static final String CLAIM_NAME = "jwtClaim";
    
        /**
         * 生成 jwt token
         */
        public static String creatJwt(JwtClaim jwtClaim, Long tokenExpireTime, String secretKey) {
            Date now = new Date();
            Date date = new Date(now.getTime() + tokenExpireTime);//根据当前时间 + tokenExpireTime(token有效期,以毫秒为单位 例:7200000为2小时)
            return Jwts.builder()
                    .claim(CLAIM_NAME, jwtClaim)//jwtClaim为自定义对象,存放自定义参数(数据存放在Payload)
                    .setIssuedAt(now)//生成时间
                    .setExpiration(date)//token到期时间
                    .signWith(SignatureAlgorithm.HS256, secretKey)//加密方式,secretKey自定义密钥
                    .compact();
    
        }
    
        /**
         * 解析 jwt
         */
        public static Claims parseJwt(String token, String secretKey) {
            try {
                //注掉代码为完整的获取自定义对象参数的方式,为注掉的为我工具类方法
    //            JwtTokenDto jwtTokenDto = new JwtTokenDto();
    //            Claims body = Jwts.parser()
    //            .setSigningKey(secretKey)//secretKey密钥
    //            .parseClaimsJws(token)//需要解析的token
    //            .getBody();//获取存入的参数及自定义的jwtClaim对象中的参数
    //            BeanUtil.copyProperties(body.get(JwtUtils.CLAIM_NAME), jwtTokenDto);
    //            return jwtTokenDto;
                return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
            } catch (ExpiredJwtException e) {//此异常为生成的token过期异常
                log.info("校验的token过期!");
                throw new BusinessException("Token过期!", ResponseParameter.CODE_HTTP_XXX);//自定义异常处理类
            }
    
        }
    
    //第二种token生成方式
    //    /**
    //     * 生成 jwt token
    //     */
    //    public static String creatJwtTo(String userId){
    //
    //        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);//SECRET_KEY自定义密钥
    //        // 设置头信息
    //        HashMap<String, Object> header = new HashMap<>(2);
    //        header.put("typ","JWT");
    //        header.put("alg","HS256");
    //
    //        TokenVo tokenVo = new TokenVo();
    //        // 生成 Token
    //        String token = JWT.create().withHeader(header)
    //
    //                .withClaim("userId", userId)//自定义参数
    //                .withClaim("userName",header)//自定义参数
    //                .withClaim("test","test")//自定义参数
    //                .withExpiresAt(new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME)).sign(algorithm);//TOKEN_EXPIRE_TIME token过期时间毫秒
    //        return token;
    //
    //    }
    //
    //
    //    /**
    //     *  解析 jwt
    //     */
    //    public static Map<String, Claim> parseJwtTo(String token){
    //        Map<String, Claim> claims = null;
    //        try {
    //            Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);//SECRET_KEY自定义密钥
    //            JWTVerifier verifier = JWT.require(algorithm).build();
    //            DecodedJWT jwt = verifier.verify(token);//需要解析token
    //            claims = jwt.getClaims();
    //            return claims;
    //        } catch (Exception e) {
    //            return null;
    //        }
    //    }
    
    }
    

    更多相关内容
  • JWT Token生成及验证

    2020-07-16 17:07:57
    JWT Token生成及验证:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现
  • 主要介绍了JWT Token实现方法及步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了SpringSecurity Jwt Token 自动刷新的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了thinkphp框架使用JWTtoken的方法,结合实例形式分析了JWTtoken的功能、原理及thinkPHP使用JWTtoken实现签名验证的相关操作技巧,需要的朋友可以参考下
  • JWT token的组成 头部(Header),格式如下: { “typ”: “JWT”, “alg”: “HS256” } 由上可知,该token使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串: eyJhbGciOiJIUzI1NiJ9 有效...
  • JWT Token生成及验证(源码)
  • jwt token 实现

    2018-07-27 14:30:07
    本例子教你如何在你的项目中搭建jwt token授权登录,代码清晰易懂。
  • 需要在数据库中增加api_token字段,记录用户认证token并进行身份校验,如果需要使用jwt,无需添加字段,需要借助三方库来实现。 目录 Token认证原理 JWT概述 实现方法 Token认证原理 客户端发送认证信息

    在开发Api时,处理客户端请求之前,需要对用户进行身份认证,Laravel框架默认为我们提供了一套用户认证体系,在进行web开发时,几乎不用添加修改任何代码,可直接使用,但在进行api开发时,需要我们自己去实现,并且Laravel框架默认提供的身份认证不是jwt的,需要在数据库中增加api_token字段,记录用户认证token并进行身份校验,如果需要使用jwt,无需添加字段,需要借助三方库来实现。

    目录

    Token认证原理

    JWT概述

    实现方法


    Token认证原理

    1. 客户端发送认证信息 (一般就是用户名 / 密码), 向服务器发送请求

    2. 服务器验证客户端的认证信息,验证成功之后,服务器向客户端返回一个 加密的 token (一般情况下就是一个字符串)

    3. 客户端存储 (cookie, session, app 中都可以存储) 这个 token, 在之后每次向服务器发送请求时,都携带上这个 token

    4. 服务器验证这个 token 的合法性,只要验证通过,服务器就认为该请求是一个合法的请求


    JWT概述

    token 只是一种思路,一种解决用户授权问题的思考方式,基于这种思路,针对不同的场景可以有很多种的实现。而在众多的实现中,JWT (JSON Web Token) 的实现最为流行.

    JWT 这个标准提供了一系列如何创建具体 token 的方法,这些缘故方法和规范可以让我们创建 token 的过程变得更加合理和效率.

    比如,传统的做法中,服务器会保存生成的 token, 当客户端发送来 token 时,与服务器的进行比对,但是 jwt 的不需要在服务器保存任何 token, 而是使用一套加密 / 解密算法 和 一个密钥 来对用户发来的 token 进行解密,解密成功后就可以得到这个用户的信息.

    这样的做法同时也增加了多服务器时的扩展性,在传统的 token 验证中,一旦用户发来 token, 那么必须要先找到存储这个 token 的服务器是哪台服务器,然后由那一台服务器进行验证用户身份。而 jwt 的存在,只要每一台服务器都知道解密密钥,那么每一台服务器都可以拥有验证用户身份的能力.

    这样一来,服务器就不再保存任何用户授权的信息了,也就解决了 session 曾出现的问题.

    实现方法

    1.安装 jwt-auth

    composer require tymon/jwt-auth:dev-develop

    参考文档:

    Installation · tymondesigns/jwt-auth Wiki · GitHub

    2.在  config/app.php  的  providers  配置项中注册服务提供者

    'providers' => [
        、、、
        Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
    
    ],
    'aliases' => [      
        、、、
        'JWTAuth'         => Tymon\JWTAuth\Facades\JWTAuth::class,
        'JWTFactory'      => Tymon\JWTAuth\Facades\JWTFactory::class,
    ],

    3.生成配置文件

    php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
    

    此命令会在 config 目录下生成 jwt.php 配置文件

    5.创建模型(若已存在用户模型,则不需要生成,修改对应的继承关系即可)

    php artisan make:model Models/User

    代码:

    <?php
    
    namespace App\Models;
    
    use Tymon\JWTAuth\Contracts\JWTSubject;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    /**
    * 说明:
    * 1.账号名可不用name,但密码必须要用password字段
    * /
    class User extends Authenticatable implements JWTSubject
    {
    
        protected $fillable = ['name', 'password'];
    
        protected $hidden = ['password', 'remember_token'];
    
        /**
        *  新增方法
        */
        public function getJWTIdentifier()
        {
            return $this->getKey();
        }
    
        /**
        *  新增方法
        */
        public function getJWTCustomClaims()
        {
            return [];
        }
    }

    6.修改配置文件 auth.php

        'guards' => [
            'api' => [
                'driver' => 'jwt',
                'provider' => 'users', // 对应下方的providers=>users数组
                'hash' => false,
            ],
        ],
    
        'providers' => [
            'users' => [
                'driver' => 'eloquent',
                'model' => App\Models\User::class // 对应上一步的模型
            ],
        ],

    7.实现登录注册返回 token

    php artisan make:controller Api/UserController   // 创建控制器
    <?php
    
    namespace App\Http\Controllers\Api;
    
    use App\Http\Controllers\Controller;
    use App\Models\Member;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Hash;
    use Tymon\JWTAuth\Facades\JWTAuth;
    use Tymon\JWTAuth\Facades\JWTFactory;
    
    class UserController extends Controller
    {
        public function __construct()
        {
            $this->middleware('auth:api', ['except' => ['register', 'login']]);
        }
    
        /**
        * 用户注册
        */
        public function register(Request $request)
        {
            // jwt token
            $credentials = [
                'name' => $request->name,
                'password' => Hash::make($request->password)
            ];
            $user = User::create($credentials);
            if($user){
                $token =  = JWTAuth::fromUser($user);
                // JWTFactory::setTTL(80);// 设置TOKEN缓存时间
                return $this->responseWithToken($token);
            }
        }
    
        /**
        * 用户登录
        */
        public function login(Request $request)
        {
            // todo 用户登录逻辑
    
            // jwt token
            $credentials = $request->only('name', 'password');
            // $credentials['status'] = 1; // 需要在验证登录的时候,需要验证其他参数,可这样加
            if (!$token = JWTAuth::attempt($credentials)) {
                return response()->json(['result'=>'failed']);
            }
            // JWTFactory::setTTL(80);// 设置TOKEN缓存时间
            return $this->responseWithToken($token);
        }
    
        /**
        * 刷新token
        */
        public function refresh()
        {
            return $this->responseWithToken(JWTAuth::refresh());
        }
    
        /**
        * 退出登录
        */
        public function logout(Request $request)
        {
            JWTAuth::invalidate(JWTAuth::getToken()); // 即把当前token加入黑名单
            // auth()->logout();
        }
    
        /**
        * 获取用户信息
        */
        public function userInfo(Request $request)
        {
            $user = [];
            try {
                $token = JWTAuth::getToken();
                if($token){
                    JWTAuth::setToken($token);
                    $user = JWTAuth::toUser();
                } 
            } catch (\Exception $exception) {
                dd($exception->getMessage());
            }
    
    
            return response()->json(['result' => $user]);
        }
    
        /**
        * 响应
        */
        private function responseWithToken(string $token)
        {
            $response = [
                'access_token' => $token,
                'token_type' => 'Bearer',
                'expires_in' => JWTFactory::getTTL() * 60
            ];
    
            return response()->json($response);
        }
    }
    

    7.创建中间件解决跨域问题(无需跨域可以省去此步奏)

    php artisan make:middleware CORS

    编辑 app/Http/Middleware/CORS.php

    <?php
     
    namespace App\Http\Middleware;
     
    use Closure;
     
    class CORS
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            //解决跨域问题
            header('Access-Control-Allow-Origin: *');
     
            $headers = [
                'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
                'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
            ];
            if($request->getMethod() == "OPTIONS") {
                return Response::make('OK', 200, $headers);
            }
     
            $response = $next($request);
            foreach($headers as $key => $value)
                $response->header($key, $value);
            return $response;
        }
    }

    注册中间件  ----编辑 app/Http/Kernel.php

    /**
    * The application's route middleware.
    *
    * These middleware may be assigned to groups or used individually.
    *
    * @var array
    */
    protected $routeMiddleware = [
        ...
        'cors'=> \App\Http\Middleware\CORS::class,
    ];

    8.创建中间件验证token

    php artisan make:middleware User/authJWT

    编辑 app/Http/Middleware/authJWT.php

    <?php
     
    namespace App\Http\Middleware;
     
    use Closure;
    use Tymon\JWTAuth\Facades\JWTAuth;
    use Tymon\JWTAuth\Exceptions\JWTException;
    use Tymon\JWTAuth\Exceptions\TokenExpiredException;
    use Tymon\JWTAuth\Exceptions\TokenInvalidException;
     
    class authJWT
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            try {
                /**
                *TODO 获取用户信息的方法可封装起来
                *对应的放回参数可根据个人习惯进行自定义
                */
                $token = JWTAuth::getToken();
                if ($token) JWTAuth::setToken($token);
                if (!$user = JWTAuth::toUser()){
                    return response()->json([
                        'errcode' => 400004,
                        'errmsg' => '无此用户'
                    ], 404);
                }
     
            } catch (TokenExpiredException $e) {
     
                return response()->json([
                    'errcode' => 400001,
                    'errmsg' => 'token 过期'
                ], $e->getStatusCode());
     
            } catch (TokenInvalidException $e) {
     
                return response()->json([
                    'errcode' => 400003,
                    'errmsg' => 'token 失效'
                ], $e->getStatusCode());
     
            } catch (JWTException $e) {
     
                return response()->json([
                    'errcode' => 400002,
                    'errmsg' => 'token 参数错误'
                ], $e->getStatusCode());
     
            }
            return $next($request);
        }
     
     
    }

    注册该中间件----编辑 app/Http/Kernel.php

    /**
    * The application's route middleware.
    *
    * These middleware may be assigned to groups or used individually.
    *
    * @var array
    */
    protected $routeMiddleware = [
        ...
        'jwt.custom.auth'=> \App\Http\Middleware\User\authJWT::class, // 不能使用'jwt.auth',因为安装包已经使用了,若验证失败默认是返回401页面而不是json参数
    ];

     编辑对应路由文件 routes\api.php

    <?php
     
    use Illuminate\Http\Request;
     
    /*
    |--------------------------------------------------------------------------
    | API Routes
    |--------------------------------------------------------------------------
    |
    | 若需要添加跨域的中间件可设成['middleware' => ['api','cors'],'prefix' => 'admin-user']
    | 我的这些中间件在 app/Providers/RouteServiceProvider.php 中已设置,
    | 所以在当前文件不需要添加
    | 
    */
    Route::group(['prefix' => 'admin-user'], function () {
        // 当前为不要验证TOKEN的路由
        Route::any('login', 'AdminUserController@login');
        Route::any('register', 'AdminUserController@register');
        
        // 需要验证token的路由可在下方添加
        Route::group(['middleware' => 'jwt.custom.auth'], function () {
            Route::any('user-info', 'AdminUserController@userInfo');
        });
    });

    参考:

    1. Laravel Api实现JWT Token认证 - Stephen's Blog
    2. Laravel 使用 JWT 完成多用户认证_科比龙篮的博客-CSDN博客
    展开全文
  • 什么是 JWT Token

    千次阅读 2021-09-17 17:10:49
    什么是 JWT TokenJWT 简介认证流程用户认证的流程安全限制客户端附带 JWT Token 的方式Bearer 是什么意思? JWT 简介 JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一...

    JWT 简介

    JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。

    认证流程

    在这里插入图片描述

    用户认证的流程

    • 用户使用账号(手机/邮箱/用户名)密码请求服务器
    • 服务器验证用户账号是否和数据库匹配
    • 服务器通过验证后发送给客户端一个 JWT Token
    • 客户端存储 Token,并在每次请求时携带该 Token
    • 服务端验证 Token 值,并根据 Token 合法性返回对应资源

    安全限制

    为防止用户恶意注册,系统对 IP 默认进行了限制,条件如下:

    • 单 IP 5 分钟内连续注册超过 3 次会被禁止;
    • 单 IP 5 分钟内连续登录失败超过 3 次会要求输入验证码;

    客户端附带 JWT Token 的方式

    用户在完成认证后会返回开发者一个 JWT Token,开发者需将此 Token 存储于客户端,然后将此 Token 发送给开发者受限的后端服务器进行验证。

    建议使用 HTTP Header Authorization 的形式携带 Token,以下以 JavaScript 的 axios 库为例示范如何携带:

    const axios = require("axios");
    axios
      .get({
        url: "https://domain.com/api/v1/",
        headers: {
          Authorization: "Bearer ID_TOKEN",
        },
      })
      .then((res) => {
        
      });
    
    

    Bearer 是什么意思?

    Bearer Token (RFC 6750 (opens new window)) 用于授权访问资源,任何 Bearer 持有者都可以无差别地用它来访问相关的资源,而无需证明持有加密 key。一个 Bearer 代表授权范围、有效期,以及其他授权事项;一个 Bearer 在存储和传输过程中应当防止泄露,需实现 Transport Layer Security (TLS);一个 Bearer 有效期不能过长,过期后可用 Refresh Token 申请更新。

    建议开发者遵循规范,在每次请求的 Token 前附带 Bearer。

    展开全文
  • jwt token 鉴权验证

    千次阅读 2022-02-16 10:12:12
    JWT全称: JSON Web Token,以 token 的方式代替传统的cookie、session模式,用于各服务器、客户端传递信息及签名验证 2. 新增自定义函数fault() 在app/common.php中新增以下函数 /** * 抛出异常错误 * * @...

    1. JWT介绍


    本文是在TP6.0使用JWT的示例

    JWT全称: JSON Web Token,以 token 的方式代替传统的cookie、session模式,用于各服务器、客户端传递信息及签名验证

    2. 新增自定义函数 fault()


    在 app/common.php 中新增以下函数

    /**
     * 抛出异常错误
     *
     * @param string  $msg
     * @param integer $code
     */
    function fault(string $msg = "", $code = 201)
    {
        throw new \Exception($msg, $code);
    }

    3. 新增配置文件 jwt.php


    在全局配置目录 config 目录下新建 jwt.php 文件,文件内容如下

    <?php
    // +----------------------------------------------------------------------
    // | JWT (Json Web Token) 配置
    // +----------------------------------------------------------------------
    // | Author: liang 30041321@qq.com
    // +----------------------------------------------------------------------
    return [
        'iss'             => 'liang',   // 签发者
        'aud'            => 'chen',    // 接收者
        'key'            => 'yang',    // 访问密钥
        'prefix'         => 'jwt_',    // 缓存前缀
        'exp'            => 864000,    // 过期时间,864000秒=10天
        'single_sign_on' => false,      // 单点登录 true 开启 false 关闭
    ];

    4. JWT 功能封装类


    安装扩展包

    composer require firebase/php-jwt
    <?php
    // +----------------------------------------------------------------------
    // | JWT (Json Web Token) 功能封装类
    // +----------------------------------------------------------------------
    // | Author: liang 30041321@qq.com
    // +----------------------------------------------------------------------
    declare(strict_types=1);
    use Firebase\JWT\JWT;
    class JwtAuth
    {
        // +------------------------------------------------------------------
        // | 初始化配置
        // +------------------------------------------------------------------
        /**
         * 初始化配置
         */
        public function __construct()
        {
            $this->iss    = config('jwt.iss');     //签发者 可选
            $this->aud    = config('jwt.aud');     //接收该JWT的一方,可选
            $this->exp    = config('jwt.exp');     //过期时间,864000秒 = 10天
            $this->key    = config('jwt.key');     //访问秘钥
            $this->prefix = config('jwt.prefix');  //缓存前缀
        }
        // +------------------------------------------------------------------
        // | 创建、解析 token
        // +------------------------------------------------------------------
        /**
         * 创建token
         *
         * @param  array  $data
         * @return string token
         */
        public function encode(array $data)
        {
            $time = time(); //当前时间
            $token = [
                'iss'  => $this->iss,           //签发者 可选
                'aud'  => $this->aud,           //接收该JWT的一方,可选
                'iat'  => $time,                //签发时间
                'nbf'  => $time,                //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
                'exp'  => $time + $this->exp,   //过期时间
                'data' => $data,                //附加数据
            ];
            $token = JWT::encode($token, $this->key); // 创建token
            $this->cache($data['uid'], $token); // 将token存入缓存
            return $token; // 返回token
        }
        /**
         * 解析token
         *
         * @param string $token 前端请求携带的token
         */
        public function decode(string $token)
        {
            try {
                JWT::$leeway = 0; //当前时间减去60,把时间留点余地
                return JWT::decode($token, $this->key, ['HS256']); //HS256方式,这里要和签发的时候对应
            } catch (\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
                fault('签名不正确');
            } catch (\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
                fault('登录未生效');
            } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
                fault('登录过期');
            } catch (\Exception $e) {  //其他错误
                fault($e->getMessage());
            }
        }
        // +------------------------------------------------------------------
        // | 检测token
        // +------------------------------------------------------------------
        /**
         * 将用户token存入缓存,用于单点登录校验
         *
         * @param int    $id    用户id
         * @param string $token 服务器端生成的token
         */
        private function cache(int $uid, string $token)
        {
            // 缓存token
            cache($this->prefix . $uid, $token);
        }
        /**
         * 检测token是否已过期(单点登录)
         *
         * @param  int     $id    用户id
         * @param  string  $token 前端请求携带的token
         * @return boolean true   token 有效 false 已过期
         */
        public function checkToken(int $id, string $token)
        {
            // 判断是否开启单点登录校验 true 开启 false 关闭
            if (config('jwt.single_sign_on')) {
                // 获取缓存中该用户的token
                $cacheToken = cache($this->prefix . $id);
                // true 有效 false 已过期
                return $token === $cacheToken;
            } else {
                return true; // 没有开启单点登录直接返回true
            }
        }
    }

    5. JWT 鉴权控制器


    创建鉴权控制器,所有需要进行Token校验的控制器只需要继承该控制器即可

    php think make:controller api@Auth --plain

    鉴权控制器文件内容如下:

    <?php
    // +----------------------------------------------------------------------
    // | JWT (Json Web Token) 
    // +----------------------------------------------------------------------
    // | Author: liang 30041321@qq.com
    // +----------------------------------------------------------------------
    declare(strict_types=1);
    namespace app\api\controller;
    use JwtAuth;
    use app\BaseController;
    /**
     * JWT 鉴权控制器
     */
    class Auth extends BaseController
    {
        /**
         * 校验token是否有效
         */
        protected function initialize()
        {
            // 接收请求头中的Token
            $token = request()->header('token');
            // 初步校验token
            empty($token) && fault('token不能为空');
            // 解析token,返回生成token时的附加数据
            $this->jwt = app(JwtAuth::class)->decode($token)->data;
            // 获取附加数据中的用户id并转为整型
            $this->uid = (int) $this->jwt->uid;
            // 携带的token和缓存中的token进行比对(单点登录校验)
            if (!app(JwtAuth::class)->checkToken($this->uid, $token)) {
                fault('登录状态已过期', 401);
            }
        }
    }

    展开全文
  • JWT token 实践问题解决

    千次阅读 2021-01-02 00:04:49
    JWT 实现 token 认证讲述了 JWT一些基本概念,使用JWT token 的优缺点以及使用需要注意的问题。本章主要讲述在使用 JWT token 过程中遇到的问题以及解决方案。 token 是什么?token 是用户登录的时候颁发的。 改造...
  • 内容只为接口开发,配合前端和移动app调用使用,不包含html页面,基于springboot+oauth2.0+jwttoken鉴权(内有怎么使用redistoken和数据库token注释)+restful风格+阿里短信+阿里消息推送+车牌识别等。该项目为工作...
  • JWT Token 的生成及解密

    千次阅读 2022-02-16 10:15:30
    前端存入token,在请求其他接口是将token带入header头中 二、使用步骤 1.引入jwt 库 安装: composer require firebase/php-jwt 依赖composer,通过cmd进入项目根目录 或者项目终端安装: 检...
  • 主要介绍了基于Java验证jwt token代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 手把手教你实现JWT Token

    千次阅读 2019-10-26 09:31:08
    Json Web TokenJWT) 近几年是前后端分离常用的Token技术,是目前最流行的跨域身份验证解决方案。你可以通过文章JWT。今天我们来手写一个通用的JWT服务。DEMO获取方式在文末,实现在jwt相关包下 2. spring-...
  • JWT token 过期续签的问题想法 服务端保存签发的token,进行失效判断,使用Redis保存 如果服务端,不保存token 客户端解析 token中 payload的数据,添加失效时间,再失效时间之前再次进行签到 客户端 保存两...
  • Spring Security Jwt Token 自动刷新

    千次阅读 2020-06-07 17:38:32
    最近项目中有这么一个功能,用户登录系统后,需要给 用户 颁发一个 token ,后续访问系统的请求都需要带上这个 token ,如果请求没有带上这个 token 或者 token 过期了,那么禁止访问系统。如果用户一直访问系统,那么...
  • 关于JWT Token 自动续期的解决方案 前言 在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwt token。前端(如vue)在接收到jwt token后会将token存储到LocalStorage中。 后续每次请求都会...
  • 为了安全,很多人都知道token长期保持不变不安全,通常会采取刷新token的机制。当是当下,很多刷新机制是为了刷新而刷新,常见的token刷新机制是:到期后刷新,或是提前刷新,或者定时刷新。如果token被盗,黑客和...
  • jwt Token】 Java生成token python 解析

    万次阅读 2021-08-12 16:51:36
    jwt Token】 Java生成token python 解析 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录【jwt Token】 Java生成token python 解析前言java一、jwt是什么?二、使用步骤1.java2....
  • JwtToken原理

    千次阅读 2019-06-21 19:39:12
    JSON Web TokenJWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息。 这些信息可以通过数字签名进行验证和信任。 可以使用...
  • 为了安全性考虑,我们可以设置JWT Token较短的过期时间,但是这样会导致客户端频繁地跳到登录界面,用户体验不好。正常解决办法是增加refresh_token,客户端使用refresh_...
  • jwt token 组成分析

    2020-12-15 10:32:50
    通过jwt组件生成的token分为 header、payload、signature三部分,通过.连接 第一部分 header eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 base64解密后 {"typ":"JWT","alg":"HS256"} 第二部分payload {"iss":"","iat":...
  • 在线JWT Token解析解码

    千次阅读 2022-02-24 17:26:41
    在线JWT Token解析解码 在线JWT Token解析解码 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线解码的功能 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供...
  • JWTToken在线编码生成

    千次阅读 2022-04-25 21:35:50
    JWTToken在线编码生成 JWTToken在线编码生成 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线编码的功能 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,687
精华内容 21,874
关键字:

jwt token