Coder Social home page Coder Social logo

jwt's Introduction

JWT

项目介绍

预备知识(可能需要科学上网)

流程图

image

目录结构

.
├── README.md
├── src
|    └── com
|        |── filter
|        |   └── Filter0_CrossOriginResource.java (跨域过滤器)
|		 |	 └── Filter1_CheckToken.java	(token校验过滤器)
|        ├── jwt
|        │   └── Jwt.java
|        │   └── JwtTestCase.java (测试用例)
|        │   └── TokenState.java  (token状态枚举)
|        |
|        └── servlet
|            └── AuthorServlet.java
├── WebRoot
|   |── WEB-INFO
|   |── index.jsp
|	|── login.html
|	|── main.html
|   └── jquery-2.1.0.js

由于使用了servlet3.0语法,运行环境要求JDK7以及以上,Tomcat7以及以上( 根目录下附带降级版本,支持jdk1.6,tomcat6 ,暂不可用,有空再更新)

本项目依赖于下面jar包:

  • nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON WEB TOKEN 解决方法,本仓库的代码是对其的进一步封装)
  • json-smart-2.0-RC2.jar和asm-1.0-RC1.jar (依赖jar包,主要用于JSONObject序列化)
  • cors-filter-2.2.1.jar和java-property-utils-1.9.1.jar(用于处理跨域ajax请求)
  • junit.jar(单元测试相关jar包)

核心类Jwt.java结构:

2个静态方法createToken和validToken,分别用于生成TOKEN和校验TOKEN; 定义了枚举TokenState,用于表示验证token时的结果,用户可根据结果进行不同处理:

  • EXPIRED token过期
  • INVALID token无效(包括token不合法,token格式不对,校验时异常)
  • VALID token有效

使用示例

获取token

Map<String , Object> payload=new HashMap<String, Object>();
Date date=new Date();
payload.put("uid", "291969452");//用户id
payload.put("iat", date.getTime());//生成时间
payload.put("ext",date.getTime()+1000*60*60);//过期时间1小时
String token=Jwt.createToken(payload);
System.out.println("token:"+token);

校验token

String token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIyOTE5Njk0NTIiLCJpYXQiOjE0NjA0MzE4ODk2OTgsImV4dCI6MTQ2MDQzNTQ4OTY5OH0.RAa71BnklRMPyPhYBbxsfJdtXBnXeWevxcXLlwC2PrY";
Map<String, Object> result=Jwt.validToken(token);

String state=(String)result.get("state");
switch (TokenState.getTokenState(state)) {
case VALID:
	//To do somethings
	System.out.println("有效token");
	break;
case EXPIRED:
	System.out.println("过期token");
	break;
case INVALID:
	System.out.println("无效的token");
	break;
}

System.out.println("返回结果数据是:" +result.toString());
	

一些坑

跨域过滤器一定要比其他过滤器先执行,不然会有些问题:在web.xml文件中,过滤器的执行顺序是按照在web.xml中从上到下书写的顺序来执行的;在servlet3.0注解中,filter执行顺序是按照文件名自然排序来决定执行顺序的,比如名字叫A的filter就比B先执行

jwt's People

Contributors

bigmeow avatar bryant1410 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jwt's Issues

jwt 相关问题请教下

  1. jwt是提倡token每次请求都改变的
    改变的话 : 客户端多线程并发请求 会导致第一个到达的请求可以 后边的请求就token失败
    不变的话 :1. 程序无法控制token的过期时间 只能等token过期后 用户在重新登录(这个过程中即使用户频繁请求接口也无法避免)。2. token不变化就会导致重放攻击 不变的token 跟sessionID 基本没什么区别
  2. jwt提倡将信息放在token第2段,第3段通过签名实现客户端无法恶意改token信息,但是token第2段是可以直接 base64_decode 拿到明文信息, 这样token泄漏就等于用户信息泄漏。目前我的处理是仅仅将用户的唯一识别(uid)加密后在生成token的
  3. 用户信息放在token里面 当用户信息改变的话 就要 重新生成token ,修改用户信息是通过客户端请求触发的 接口可以生成新的token发给客户端,但 如果 这个修改是从后台操作的 这个新生成的token如何给到客户端。jwt中的一些实现是每次token解出来后去查寻数据库来更新用户信息,但是每次接口都去查用户信息的开销太大 还不如sessionID + redis 的结合
  4. 用户退出登录的时候 token并未过期 如果服务端不处理将token加入黑名单 即使退出登录他的token还是可以使用的,这样的不方便还不如sessionID

多个token的问题

请问前端页面发了多个异步请求,返回多个token,这几个token都有我想要传给后端的内容,这种情况怎么解决呢

关于数据安全传输的问题

根据您的描述,可以解决权限控制问题,每次客户端请求带上token,服务器端进行校验,校验通过才执行相应的操作,那么怎么保证每次传输数据的安全性?看过你介绍的2篇关于token的文章,理解的是每次请求对header和body中的数据进行编码,然后拼接,最后进行加密,生成签名,发送给服务器端,服务器端每次根据客户端相同的规则进行签名的生成,是不是每次客户端每次请求都要带上token和对数据加密生成的签名,服务器端需要校验token和签名(防止请求的数据被修改)。

token失效问题

hi,请教一个问题,如果用户修改密码后,由于不存储状态,原来的access_token还会持续生效,请问这边的实现有防止旧token登陆的方案不?

Using predictable/constant cryptographic key when creating and verifing Json Web Token.

Hi, we are a research group to help developers build secure applications. We designed a cryptographic misuse detector on Java language(Our main concern is the secure implementation and use of Json Web Token). We found your great public repository (i.e.,JWT) from Github, and several security issues detected by our detector are shown in the following. The specific security issues we found are as follows:
(1) Location: Package: com.jwt; Class: Jwt.class
Security issue: Using predictable/constant cryptographic key when creating and verifing Json Web Token.

Using a predictable/constant secret does not conform to the security implementation specification of JWT, which may bring security risks to your system. It is recommended to use a more secure way to store the secret used to generate the JWT and use a strong enough key to improve the security of the project. (For the hazards of predictable/constant secret, you can refer to CWE-321, NIST Special Publication 800-57).

We wish the above security issues cloud truly help you to build a secure application. If you have any concern or suggestion, please feel free to contact us, we are looking forward to your reply. Thanks.

decode功能改进

你好:
我看了你的例子https://github.com/bigmeow/JWT。能跑起来。

 但是我另外生成了一个token的话
 "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cL2xhcmF2ZWwtYXBpLWJvaWxlcnBsYXRlLWp3dC5kZXZcL2FwaVwvYXV0aFwvbG9naW4iLCJpYXQiOjE0NjU2NDcwMjMsImV4cCI6MTQ2NTY1MDYyMywibmJmIjoxNDY1NjQ3MDIzLCJqdGkiOiI1NDBiNTViMjY2ZDdhZDE4NzRlYjNhMzgzYWE5YWJiMyJ9.oiL873vWi0m_6UukC6UO0PFJVcH1i3FR8A-rLWpKnck"

 放入到输入框中就解析不了。但是放在https://jwt.io/里面都能解析成功。请问一下你的例子如何修改才能达到https://jwt.io/的效果?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.