教程:用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 )

Java中的JWT

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

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

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

大。 得到它了? 现在,您需要使用JJWT制作令牌! 对于本教程,我们使用现有的JWT库。 Java JWT (又名JJWT)由Les Hazlewood (Apache Shiro的主要提交人,Storm的前联合创始人兼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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python用递归法写斐波那契_python实现斐波那契数列: 递归+备忘录法+动态规划实现...

1.为什么备忘录法和动态规划法:斐波那契是很多人入门递归思想的第一课,所以很多人都会最简单的一种递归写法,但是其实递归的过程,他的时间复杂度非常高,达到了O(2的n次方)这样的一个指数级别。先看最简单的&#xff1a…

【渝粤教育】电大中专电商运营实操 (2)_1作业 题库

1.电子商务最重要的是() A.商务 B.网站 C.货物 D.信息技术 正确 正确答案:左边查询 学生答案:A 2.目前菜鸟网络依赖大数据和云计算已实现了哪些功能() A.自动化仓库 B.智能发货 C.物流云加速 D.以上都正确 …

q7goodies事例_Java 8 Friday Goodies:java.io终于成功了!

q7goodies事例在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个…

python人脸识别环境搭建_Win10:Python3.6安装face_recognition人脸识别库

face_recognition简介face_recognition是Python的一个开源人脸识别库,支持Python 3.3和Python 2.7。引用官网介绍:Recognize and manipulate faces from Python or from the command line with the worlds simplest face recognition library.安装配置我…

【渝粤教育】电大中专电子商务网站建设与维护 (11)作业 题库

1.目前,阿里巴巴集团旗下主要交易市场不包括哪个( ) A.中国批发交易平台 B.全球批发交易平台 C.中国交易市场 D.国际交易市场 错误 正确答案:左边查询 学生答案:未作答 2.阿里巴巴是于1999年创立的( &#…

【渝粤教育】电大中专电子商务网站建设与维护 (9)作业 题库

1.阿里巴巴的创始人是( ) A.丁磊 B.马云 C.马化腾 D.李彦宏 错误 正确答案:左边查询 学生答案:未作答 2.阿里巴巴是于1999年创立的( )的网上贸易市场平台。 A.企业对企业 B.零售商对消费者 C.企业对零售商 …

AWS re:Invent 2018的5大公告

AWS re:Invent刚刚完成。 这是一个巨大的活动,在拉斯维加斯7家最大的酒店中,有50,000多名与会者,并发布了许多新服务。 无服务器通过新的lambda增强功能和更好的容器支持而继续引起人们的广泛关注。 AWS通过新的“ Outposts”功能…

【渝粤教育】电大中专药事管理与法规作业 题库

1.根据《执业药师职业资格制度规定》,取得药学类相关专业大专学历,报考执业药师考试,要求在药学或中药学岗位工作的年限为( )。 A.5年 B.4年 C.3年 D.6年 错误 正确答案:左边查询 学生答案:A 2.…

添加右键菜单_如何在Windows文件夹的右键菜单中添加“打开PowerShell”

原文:https://www.howtogeek.com/165268/how-to-add-open-powershell-here-to-the-context-menu-in-windows/如果您喜欢使用Windows PowerShell而不是命令提示符,那么您可能喜欢从右键单击Windows中的文件夹时得到的上下文菜单中直接访问它。以下是如何做…

【渝粤教育】电大中专计算机使用基础_1作业 题库

下列类型的软件中,功能没有任何限制且又不需要付费的是()。 A共享软件 B正版软件 C免费软件 D试用软件 错误 正确答案:左边查询 学生答案:B 2在常见的软件版本号中,Professional表示()。 A测试版 B专业版 C家庭版 D免费…

【渝粤教育】电大中专计算机职业素养_1作业 题库

1曾经的一项调查发现一些企业业绩不好,客户流失的最重要的原因是()。 A企业产品价格不好 B企业员工素养达不到要求 C企业产品质量问题 D企业管理问题 错误 正确答案:左边查询 学生答案:A 2职业素养是人类在社会活动中要…

github 公钥 私钥_理解公钥与私钥

一直都对公钥和私钥的概念不清不楚,以至于在 腾讯面试 被问到“如何在一个不安全的环境中实现安全的数据通信?”时,并没有答上来。今天查阅了一些资料,决定写一篇总结文章来加深自己的理解。一、公钥算法与私钥算法1、私钥算法私钥…

多云系统的授权

这是我目前正在致力于消耗SPIFFE( 安全生产身份框架 (Every Production Identity Framework For Everyone )在WSO2的Prabath Siriwardena先生的启发下,在Moratuwa大学的Gihan Dias教授的指导下,通过信任和身份验证在动…

【渝粤教育】电大中专跨境电子商务理论与实务 (28)作业 题库

1.跨境电子商务对接“中国制造”激活了“买卖全球”,而与跨境电商联合则成为“中国制造”在全球崛起的重要支点。该说法( ) A.正确 B.错误 错误 正确答案:左边查询 学生答案:B 2.京东海外购的运营模式是( &…

级联选择组件_如何开发一个 Antd 级联多选控件

本文也同步发在掘金上, https:// juejin.cn/post/69149942 41940750343 Intro 这篇文章将从零开始介绍如何开发一个 Antd 的级联多选选择器。先看效果: Github,Sandbox 阅读完这篇文章,不仅可以学会如何实现级联多选的功能,还可以顺便学会: 如何发布一个 Typescript 编写…

python安卓自动化测试工具有哪些_Android 手机自动化测试工具有哪几种?

如今自动化测试已经应用到每天的测试中。这不足为奇,因为自动化测试在测试过程中节约了时间,还能避免包括人为因素造成的测试错误和遗漏。自动化测试工具选择很多。一些是开源的,一些非常贵。一些自动化工具是几年前出的,一些才在市场上出来。…

通过Spring Integration消费Twitter Streaming API

1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器。 Twitter也不例外,而且很长一段时间以来,因为Spring Social一直是一个开箱即用的解决方案,Spring Integration利用该解决方案来连接到社交网络。 1.1Sp…

mysql5.6 1g内存_1G内存用MySQL5.6还是用MySQL5.5比较好

mysql的50版本和51版本的区别:一、5.0 增加了stored procedures、views、cursors、triggers、xa transactions的支持,增加了inforation_schema系统数据库。二、5.1 增加了event scheduler,partitioning,pluggable storage engine …

java aspectj_Java:AspectJ的异常翻译

java aspectj在这篇博客文章中,我描述了如何使用AspectJ自动将一种异常类型转换为另一种异常类型。 问题 有时,我们处于必须将异常(通常由第三方库引发)转换为另一种异常的情况。 假设您正在使用像hibernate这样的持久性框架&…

mysql5.6.33安装教程_Linux下mysql5.6.33安装配置教程

本教程为大家分享了mysql5.6.33在linux下的安装配置方法,供大家参考,具体内容如下1、下载下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads下载版本:我这里选择的5.6.33,通用版,linux下6…