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. django url 使用总结

    1 无参数情况 配置URL及其视图如下: (r'^hello/$', hello) def hello(request): return HttpResponse("Hello World& ...

  2. 获取URL的数据

    <!doctype html><html><head><meta charset="utf-8"><meta name=&qu ...

  3. System.out.println(i++); System.out.println(++i);的区别

    之前一直对i++和++i很模糊,这次通过两个小demo来探究下. 例1: public static void main(String[] args) { int i=2; System.out.pr ...

  4. 互评Beta版本

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2448] 基于NABCD评论作品,及改进建议 1.杨老师粉丝群.作品:<P ...

  5. STL标准库-一个万用的hash function

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过hash的使用,本次主要介绍一下Hash Function Hash Function即获得hash code的函 ...

  6. L210 Ebola

    Progress in fighting Democratic Republic of the Congo's Ebola outbreak, the second worst ever, will ...

  7. Alpha版本展示

    一.团队成员的简介和个人博客地址,团队的源码仓库地址. 1.团队的源码仓库地址 我们主要通过码云来管理代码,码云地址:https://gitee.com/ljl36/team_programming ...

  8. jquery日期和时间的插件精确到秒

    首先.html5提供了input的time类型,使我们可以通过input框输入日期,但是如果我们的需求是这个时间需要明确到几时几分几秒的,那html5就没有办法满足我们的需求了,就需要使用jQuery ...

  9. HDU 2907

    http://acm.hdu.edu.cn/showproblem.php?pid=2907 ans=(凸包顶点数-凸包凹面数量)*q-凸包凹面数量*p 重点在求一个凸包的凹面数量,极角排序过后,当前 ...

  10. web测试小结

    今年5月份开始接触web测试,经过大半年的测试及学习,简单总结下 测试过程: 1.需求理解 2.测试策略.方案.用例编写及评审 3.测试环境搭建 4.测试执行 5.bug提单.问题跟踪 6.回归测试 ...