java jwt 验证

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

Java对JWT(JSON Web令牌)的支持过去需要进行大量工作:广泛的自定义,花费数小时来解决依赖项,以及仅用于组装简单JWT的代码页。 不再!

本教程将向您展示如何使用现有的JWT库做两件事:

  1. 生成一个JWT
  2. 解码并验证JWT

您会注意到本教程很短。 那是因为那很容易。 如果您想更深入地了解,请查看JWT规范或深入阅读有关在Spring Boot应用程序中使用JWT进行令牌身份验证的更长的文章 。

什么是JWT?

JSON Web令牌是JSON对象,用于在各方之间以紧凑和安全的方式发送信息。 JSON规范 (或Javascript对象表示法)定义了一种使用键值对创建纯文本对象的方法。 这是一种构造基于原始类型(数字,字符串等)的数据的紧凑方法。 您可能已经非常熟悉JSON。 就像没有括号的XML。

令牌可用于在各方之间发送任意状态。 这里的“当事人”通常是指客户端Web应用程序和服务器。 JWT具有多种用途:身份验证机制,URL安全编码,安全共享私有数据,互操作性,数据过期等。

实际上,此信息通常与两件事有关:授权和会话状态。 服务器可以使用JWT告知客户端应用程序允许用户执行哪些操作(或允许他们访问哪些数据)。

JWT通常还用于存储Web会话的状态相关用户数据。 因为JWT是在客户端应用程序和服务器之间来回传递的,所以这意味着状态数据不必存储在某个地方的数据库中(随后在每个请求中都可以检索)。 因此,它可以很好地扩展。

让我们看一个JWT示例(取自jsonwebtoken.io )


JWT具有三部分:标头,正文和签名。 标头包含有关JWT编码方式的信息。 主体是代币的索赔所在的地方)。 签名提供了安全性。

关于令牌的编码方式以及信息在体内的存储方式,我们不会在这里讨论很多细节。 如果需要,请查看前面提到的教程 。

不要忘记:加密签名不​​提供保密性; 它们只是检测篡改JWT的一种方式,除非JWT经过专门加密,否则它们是公开可见的。 签名只是提供了一种验证内容的安全方法。

大。 得到它了? 现在,您需要使用JJWT制作令牌! 对于本教程,我们使用现有的JWT库。 Java JWT (又名JJWT)由Les Hazlewood (Apache Shiro的主要提交人,Apache Shiro是Stormpath的前联合创始人兼CTO,现在是Okta自己的高级架构师)创建的,JJWT是一个简化JWT创建和验证的Java库。 它完全基于JWT , JWS , JWE , JWK和JWA RFC规范,并根据Apache 2.0许可的条款开源。 该库还为规范添加了一些不错的功能,例如JWT压缩和声明执行。

用Java生成令牌

这部分超级容易。 让我们看一些代码。 克隆GitHub存储库 :

git clone https://github.com/oktadeveloper/okta-java-jwt-example.git cd okta-java-jwt-example

这个示例非常基础,并且包含一个src/main/java/JWTDemo.java类文件,其中包含两个静态方法: createJWT()decodeJWT() 。 足够巧妙的是,这两种方法创建了一个JWT并对JWT进行解码。 看下面的第一种方法。

public static String createJWT(String id, String issuer, String subject, long ttlMillis) {//The JWT signature algorithm we will be using to sign the tokenSignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);//We will sign our JWT with our ApiKey secretbyte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY);Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());//Let's set the JWT ClaimsJwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).setIssuer(issuer).signWith(signatureAlgorithm, signingKey);//if it has been specified, let's add the expirationif (ttlMillis > 0) {long expMillis = nowMillis + ttlMillis;Date exp = new Date(expMillis);builder.setExpiration(exp);}  //Builds the JWT and serializes it to a compact, URL-safe stringreturn builder.compact();
}

总而言之, createJWT()方法执行以下操作:

  • 设置哈希算法
  • 获取签发日期索赔的当前日期
  • 使用SECRET_KEY静态属性生成签名密钥
  • 使用流利的API添加声明并签署JWT
  • 设置到期日期

可以根据您的需求进行定制。 例如,如果您想添加其他或自定义声明。

解码令牌

现在看一下更简单的decodeJWT()方法。

public static Claims decodeJWT(String jwt) {//This line will throw an exception if it is not a signed JWS (as expected)Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(SECRET_KEY)).parseClaimsJws(jwt).getBody();return claims;
}

该方法再次使用静态SECRET_KEY属性生成签名密钥,并使用该方法来验证JWT是否未被篡改。 如果签名与令牌不匹配,则该方法将引发io.jsonwebtoken.SignatureException异常。 如果签名确实匹配,则该方法将索赔作为Claims对象返回。

差不多了!

运行JUnit测试

为了获得更多荣誉,您可以在示例项目中运行JUnit测试。 有三个测试,它们演示了JJWT库的一些基本功能。 第一个测试显示了一条愉快的路,创建并成功解码了有效的JWT。 第二个测试显示了当您尝试将完全伪造的字符串解码为JWT时,JJWT库将如何失败。 最后一个测试显示了被JJWT篡改的方式将如何使decodeJWT()方法引发SignatureException

您可以使用以下命令从命令行运行这些测试:

./gradlew test -i

-i用于将Gradle的日志级别设置为Info以便我们看到测试的简单日志输出。

了解有关在Java应用中使用JWT的更多信息

JJWT库使创建和验证JWT非常容易。 只需指定一个秘密密钥和一些声明,您就会拥有一个JJWT。 以后,使用相同的密钥对JJWT进行解码并验证其内容。

现在,创建和使用JJWT非常简单,为什么不使用它们呢?

不要忘记SSL! 请记住,除非对JWT进行加密,否则在其中编码的信息通常仅是Base64编码的,任何小孩和一些宠物都可以读取。 因此,除非您希望中国,俄罗斯和FBI读取所有会话数据,否则请使用SSL对其进行加密。

Baeldung 在Java和JWT上有相当不错的深入教程 。

另外,这里还有Okta博客提供的更多链接,可帮助您继续前进:

  • Java应用程序的简单令牌认证
  • Spring Boot,OAuth 2.0和Okta入门
  • 保护Spring Boot应用程序安全的10种绝佳方法
  • 如果您的JWT失窃了怎么办?
  • JWT分析器和检查器Chrom插件
  • 在线编码或解码JWT

如果您对此帖子有任何疑问,请在下面添加评论。 有关更多精彩内容, 请在Twitter上关注@oktadev , 在Facebook上关注我们,或订阅我们的YouTube频道 。

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

``教程:用Java创建和验证JWT''最初于2018年10月31日发布在Okta开发人员博客上。

翻译自: https://www.javacodegeeks.com/2019/01/tutorial-create-verify-jwts-java.html

java jwt 验证

java jwt 验证_教程:用Java创建和验证JWT相关推荐

  1. java 鉴权_我爱java系列之---【JWT实现微服务鉴权(一)】

    JWT介绍 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签 ...

  2. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  3. java基础分享_一、java基础教程

    1.java是一门比较纯粹的面向对象编程语言,所以java的所有代码都必须写在类的内部. 1.1 java的可执行文件后缀名是".java",例如HelloWorld.java,并 ...

  4. java授权失败_自定义Spring Security的身份验证失败处理方法

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...

  5. java程序license验证_基于TrueLicense实现产品License验证功能

    受朋友所托,需要给产品加上License验证功能,进行试用期授权,在试用期过后,产品不再可用. 通过研究调查,可以利用Truelicense开源框架实现,下面分享一下如何利用Truelicense实现 ...

  6. java怎么安装_最新版Java安装教程

    我是Presikid,今天又来更新文章啦,今天要来教大家如何正确.快速地安装Java最新版本. 备注:这篇文章的教程是关于JRE的,不是安装JDK的,两者之间有莫大的区别,JRE是Java运行环境,运 ...

  7. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

    作者:digdeep .cnblogs.com/digdeep/p/4525567.html 导引 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相 ...

  8. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  9. java 时区处理_如何使用Java处理日历时区?

    如何使用Java处理日历时区? 我有一个来自我的应用程序的Timestamp值. 用户可以在任何给定的本地TimeZone中. 由于此日期用于假定给定时间始终为GMT的WebService,因此我需要 ...

最新文章

  1. 学习笔记之xss原理篇
  2. phpinfo查看可以解析的后缀_配置nginx,Apache支持pathinfo模式-什么是phpinfo模式
  3. 二级计算机为让利消费者,计算机二级office题库训练题(2)
  4. harbor镜像清理:使用registry:2.6.2-photon garbage-collect
  5. OpenSSL(加密方式,加密算法,自签证书)
  6. PHP 过滤器(Filter)
  7. 基本农田卫星地图查询_如何基于西安80坐标查询定位
  8. Web前端工作笔记004---js--webSocket简单介绍和使用方法
  9. sap权限激活_SAP产品的Field Extensibility
  10. 华为 seco pc版下载_狼人之间电脑版下载-狼人之间pc版下载v1.8 官方版
  11. VirtuoZo数字摄影测量(二)——模型定向与核线影像生成
  12. xml建模包括以下_数据挖掘--建模与挖掘的结合
  13. PDF文档阅读必备的PDF阅读器
  14. 太空大战--声音与特效
  15. 小鑫的算法之路:leetcode0704 二分查找
  16. 计算机组成原理之原码一位乘法过程
  17. Android8.1 SystemUI 之图案锁验证流程
  18. 安卓桌面壁纸_火莹视频桌面:好玩的动态桌面壁纸软件,让你的桌面动起来
  19. 迪克斯特拉算法(Dijkstra 最短路算法)(简单易懂)
  20. 干货|五分钟轻松入门眼动实验软件之Tobii Pro Lab

热门文章

  1. Desert King POJ - 2728
  2. 模板:回文自动机(PAM)
  3. P3605 [USACO17JAN]Promotion Counting P(树状数组)
  4. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
  5. jzoj1213-棋盘上的士兵【状压dp】
  6. 欢乐纪中某B组赛【2019.1.21】
  7. P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)
  8. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
  9. hdu4609 3idiots 三角形计数 FFT
  10. Java集合面试问题