jwt 是什么 ?   json web token  的 简称,是一种无状态的 认证机制

原理:客户端 向服务器端请求一个 jwt 生成的 token ,这个token 带有 一些信息,下次 客户端请求 接口的时候带上这个 token,服务器端  检查这个 token,以此 判断用户的请求是否合法。所以 jwt是做认证的,不要理解成加密的了。

jwt生成的 token 组成:  头部.负载.签名

头部: 是 base64 编码的 包含有签名算法的 json 字符串

  比如  header 为 {"alg":"HS512"} 加密以后就是 eyJhbGciOiJIUzUxMiJ9

负载: 有承载的数据 和 时间的  json 字符串  被 base64 转码以后得到的 数据

  比如: playload 为  {"sub":"18508280881,100","exp":1532672451} 对应着 eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9

签名:签名是验证  jwt token 是否合法的  签名= 头指定的算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

  secret   是 一个 只有服务器 知道的 秘钥;

上面的 完整token:eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9.sJaL2dpYAQdi3ZloDjIHzuIUetHEupMVD5dnnNjWdHFOrLZXgZi2C68FG1O5UGZ0_JMNW8rqYDECw9ligoc1RQ

secret 是:abc=

Java 代码例子如下

package com.sbl.pay.subaccount;

import java.util.Calendar;
import java.util.Date; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; /**
* jwt工具
* @author ZHANGYUKUN
*
*/
public class JWTUtil { public static void main(String[] args) {
String secretKey = "abc="; System.out.println( JWTUtil.createToken( "zyk" ,secretKey) );
System.out.println( JWTUtil.checkToken( secretKey , JWTUtil.createToken("zyk" ,secretKey) ) ); } /**
* 验证 token
* @param secretKey
* @param tokenValue
* @return 成功 返回 解密后的内容,否者抛出异常
*/
public static String checkToken(String secretKey,String tokenValue) {
Claims claims = Jwts.parser().setSigningKey( secretKey ).parseClaimsJws(tokenValue).getBody();
return claims.getSubject();
} /**
* 生成 token
* @param content 负载的内容
* @param secretKey 秘钥
* @return token
*/
public static String createToken(String content,String secretKey) {
JwtBuilder builder = Jwts.builder().setSubject( content );
String userToken = builder.signWith(SignatureAlgorithm.HS512, secretKey ).compact();
return userToken;
} /**
* 生成 token
* @param content 负载的内容
* @param secretey 秘钥
* @param expiresTime 过期时间(秒)
* @return token
*/
public static String createToken(String content,String secretKey,int expiresTime) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND , expiresTime ); JwtBuilder builder = Jwts.builder().setSubject( content ).setExpiration( calendar.getTime() );
String userToken = builder.signWith(SignatureAlgorithm.HS512, secretKey ).compact();
return userToken;
} }

  

结果

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI1OTA1MzZ9.ckV39Ev9_SQxwABeSfVfcuCndwEyOZUbkUXdPeZIjBVTo4UlSXYFamjmRqp8w7yDrJ_KDQrey4LshAMCy0MGlg
18508280881,100

  

总结 jwt的 用途是做认证,并且这种认证是无状态的和restful 天生一对, jwt 也有明显的缺点 如果 jwt 生成的 token被获取,那么 在token过期的这短时间内 可以一直被利用。 但是这个不是jwt 关心 的重点,可以通过 https 来保证数据传输的安全,可以通过 后端别的机制认证 token 是否过期(不仅仅依赖 token 里面 的 过期时间 )

采坑了:

如果验证在别人那里,被人给你的secretKey 是没有加密的。那么 你 用 base64转码以后再  生成token。 secretKey = Base64.getEncoder().encodeToString( secretKey.getBytes() ); 。否者这边对的,两边一对接就出错。

jwt 的使用的更多相关文章

  1. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  2. JWT实现token-based会话管理

    上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...

  3. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  4. Laravel-lumen 配置JWT

    具体步骤参照: [ JWT & Lumen ] 第一步 在项目根目录 执行命令 composer require tymon/jwt-auth第二步 在 bootstrap/app.php 的 ...

  5. .net core Jwt 添加

    Jwt 已经成为跨平台身份验证通用方案,如不了解请关注:https://jwt.io/. 为了和微软其他验证模块有个比较好的衔接,项目中采用了微软开发的jwt组件: System.IdentityMo ...

  6. 多说评论系统API调用和本地身份说明(JWT)

    多说评论系统是一个非常好用的第三方评论插件,聚合了大多数的SNS平台账号登录和分享功能,UI也很不错. 作为网站快速接入评论系统,多说是一个比较好的选择,其也提供了一些实用的API去满足定制化需求. ...

  7. 【JWT】JWT+HA256加密 Token验证

    目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...

  8. 基于Token的身份验证——JWT

    初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符 ...

  9. jwt refresh token

    $app->post('auth/refresh-token', ['middleware' => 'jwt.refresh', function() { try { $old_token ...

  10. JWT【JSON Web Token】 简述

    draft: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html http://tools.ietf.org/html/ ...

随机推荐

  1. Eclipse SVN修改用户名和密码

    问题描述:     Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能.但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的 ...

  2. OC MRC之autorelease问题(代码分析)

    // // main.m // 08-autorelease // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. All ...

  3. JavaScript学习总结(八)——JavaScript数组

    JavaScript中的Array对象就是数组,首先是一个动态数组,无需预先制定大小,而且是一个像Java中数组.ArrayList.Hashtable等的超强综合体. 一.数组的声明 常规方式声明: ...

  4. Java-Runtime 类

    https://www.cnblogs.com/slyfox/p/7272048.html Java-Runtime 类 Runtime 类代表着Java程序的运行时环境,每个Java程序都有一个Ru ...

  5. SGU 124. Broken line 射线法 eps的精准运用,计算几何 难度:3

    124. Broken line time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a closed bro ...

  6. HDU 4791 Alice's Print Service 思路,dp 难度:2

    A - Alice's Print Service Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  7. 实现checkbox的多选

    checkbox多选 技术一般水平有限,有什么错的地方,望大家指正. 全选,多选都是为了使用的方便,一般情况下全选就够用了,但是用户要求实现一个多选的功能也没有办法老老实实的做吧. 多选的实现也较为简 ...

  8. SharePoint Excel Service-PowerShell

    1. 创建一个信任的文件路径 New-SPExcelFileLocation -Address "http://sp2010/Excel Workbooks" -ExcelServ ...

  9. Python学习(003)-列表[]

    列表[] a=['张帅','李四','王五','陈六','黄旗'] print(a[2])    王五 print(a[1:3])   ['李四','王五']  左包含,右不包含 print(a[1: ...

  10. vue 登录验证引擎

    1.router配置: 路由元信息 const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, children: ...