JWT –生成和验证令牌–示例

JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明。 我的目标是展示一个小的样本,它使用出色的Nimbus JOSE + JWT库来生成和验证令牌。

总览

进行介绍的最佳地点之一是这里 。 简而言之,要从jwt.io网站的资料中借用,声明将表示为一个编码的json,分为三部分,并用点(。)分隔

header.payload.signature

标头是json,其中包含用于对内容进行签名的算法类型(在本例中为RSA),然后对内容进行url和Base64编码:

{"alg": "RS512"
}

负载是一个包含所有声明的json,有保留的声明,但也允许私有声明:

{"sub": "samplesubject","name": "John Doe","iss": "sampleissueer","admin": true,"exp": 1451849539
}

这里的“ sub”(主题),“ iss”(发布者)和“ exp”(到期)是保留的权利要求,而“ name”和“ admin”是私人权利要求。 然后对内容进行Base64Url编码。

最后,标头和有效负载一起使用共享密钥或私钥进行签名,并且签名经过Base64 url​​编码,并使用(。)分隔符附加到令牌中。

生成密钥对

我的样本是基于RSA的样本,因此第一步是生成密钥对。 JWK是一种将密钥存储为JSON表示形式的灵巧方法,Nimbus库对此提供了支持:

import java.security.KeyPairGenerator
import java.security.interfaces.{RSAPrivateKey, RSAPublicKey}import com.google.gson.{GsonBuilder, JsonElement, JsonParser}
import com.nimbusds.jose.Algorithm
import com.nimbusds.jose.jwk.{JWKSet, KeyUse, RSAKey}object JWKGenerator {def make(keySize: Integer, keyUse: KeyUse, keyAlg: Algorithm, keyId: String) = {val generator = KeyPairGenerator.getInstance("RSA")generator.initialize(keySize)val kp = generator.generateKeyPair()val publicKey = kp.getPublic().asInstanceOf[RSAPublicKey]val privateKey = kp.getPrivate().asInstanceOf[RSAPrivateKey]new RSAKey.Builder(publicKey).privateKey(privateKey).keyUse(keyUse).algorithm(keyAlg).keyID(keyId).build()}...}

给定这个密钥对,可以使用Gson从中生成一个JWK:

def generateJWKKeypair(rsaKey: RSAKey): JsonElement = {val jwkSet = new JWKSet(rsaKey)new JsonParser().parse(jwkSet.toJSONObject(false).toJSONString)}def generateJWKJson(rsaKey: RSAKey): String = {val jsonElement  = generateJWKKeypair(rsaKey)val gson = new GsonBuilder().setPrettyPrinting().create()gson.toJson(jsonElement)}

一个基于JWK的示例密钥对如下所示:

{"keys": [{"p": "2_Fb6K50ayAsnnQl55pPegE_JNTeAjpDo9HThZPp6daX7Cm2s2fShtWuM8JBv42qelKIrypAAVOedLCM75VoRQ","kty": "RSA","q": "ye5BeGtkx_9z3V4ImX2Pfljhye7QT2rMhO8chMcCGI4JGMsaDBGUmGz56MHvWIlcqBcYbPXIWORidtMPdzp1wQ","d": "gSjAIty6uDAm8ZjEHUU4wsJ8VVSJInk9iR2BSKVAAxJUQUrCVN---DKLr7tCKgWH0zlV0DjGtrfy7pO-5tcurKkK59489mOD4-1kYvnqSZmHC_zF9IrCyZWpOiHnI5VnJEeNwRz7EU8y47NjpUHWIaLl_Qsu6gOiku41Vpb14QE","e": "AQAB","use": "sig","kid": "sample","qi": "0bbcYShpGL4XNhBVrMI8fKUpUw1bWghgoyp4XeZe-EZ-wsc43REE6ZItCe1B3u14RKU2J2G57Mi9f_gGIP_FqQ","dp": "O_qF5d4tQUl04YErFQ2vvsW4QoMKR_E7oOEHndXIZExxAaYefK5DayG6b8L5yxMG-nSncZ1D9ximjYvX4z4LQQ","alg": "RS512","dq": "jCy-eg9i-IrWLZc3NQW6dKTSqFEFffvPWYB7NZjIVa9TlUh4HmSd2Gnd2bu2oKlKDs1pgUnk-AAicgX1uHh2gQ","n": "rX0zzOEJOTtv7h39VbRBoLPQ4dRutCiRn5wnd73Z1gF_QBXYkrafKIIvSUcJbMLAozRn6suVXCd8cVivYoq5hkAmcRiy0v7C4VuB1_Fou7HHoi2ISbwlv-kiZwTmXCn9YSHDBVivCwfMI87L2143ZfYUcNxNTxPt9nY6HJrtJQU"}]
}

生成JWT

现在我们有了一个很好的示例密钥对,请加载私钥和公钥:

import java.time.{LocalDateTime, ZoneOffset}
import java.util.Dateimport com.nimbusds.jose._
import com.nimbusds.jose.crypto._
import com.nimbusds.jose.jwk.{JWKSet, RSAKey}
import com.nimbusds.jwt.JWTClaimsSet.Builder
import com.nimbusds.jwt._object JwtSample {def main(args: Array[String]): Unit = {val jwkSet = JWKSet.load(JwtSample.getClass.getResource("/sample.json").toURI.toURL)val jwk = jwkSet.getKeyByKeyId("sample").asInstanceOf[RSAKey]val publicKey = jwk.toRSAPublicKeyval privateKey = jwk.toRSAPrivateKey...
}

构建有效负载,对其进行签名并生成JWT:

val claimsSetBuilder = new Builder().subject("samplesubject").claim("name", "John Doe").claim("admin", true).issuer("sampleissueer").expirationTime(Date.from(LocalDateTime.now().plusHours(1).toInstant(ZoneOffset.UTC)))val signer = new RSASSASigner(privateKey)val signedJWT: SignedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS512),claimsSetBuilder.build())signedJWT.sign(signer)val s = signedJWT.serialize()

该JWT的使用者可以读取有效负载并使用公共密钥对其进行验证:

val cSignedJWT = SignedJWT.parse(s)val verifier = new RSASSAVerifier(publicKey)println(cSignedJWT.verify(verifier))println(signedJWT.getJWTClaimsSet().getSubject())

结论

该样本完全基于Nimbus JOSE + JWT网站上提供的样本,如果您有兴趣进一步研究此内容,则绝对应参考Nimbus网站。

  • 我的样品在这里

翻译自: https://www.javacodegeeks.com/2016/01/jwt-generating-validating-token-samples.html

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

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

相关文章

无表头单链表的总结----输出链表

#include"head.h" void print(struct Student* head) {struct Student *p;printf("There are %d records:\n", sum);p head;if (p ! NULL){do{printf("%ld %d\n", p->num, p->score);p p->next;} while (p ! NULL); //以链表结尾的…

matlab 次坐标轴 标注,matlab标注坐标轴

matlab绘图如何添加图例/坐标轴刻度像这个图里的 那样的图例如何添加 还有坐标轴的刻度如何用像上图的序号 首先打开电脑上的“matlab”软件,主界面如下图所示,箭头处输入代码即可运行。下面输入代码绘制图像,命令行代码如下图所示。点击ente…

JQUERY操作html--获取和设置内容、属性、回调函数

一&#xff1a;jQuery - 获取内容和属性 1.获得内容 - text()、html() 以及 val() text() - 返回所选元素的文本内容 html() - 返回所选元素的内容&#xff08;包括 HTML 标记&#xff09; <script type"text/javascript" src"jquery-1.11.2.min.js">…

scala使用java类_使用Java和Scala将Play Framework 2应用程序部署到Openshift

scala使用java类几个星期&#xff0c; 马克阿特伍德 &#xff08; Mark Atwood&#xff09; &#xff0c; 豪尔赫艾利斯 &#xff08; Jorge Aliss &#xff09;和我塞巴斯蒂安 斯卡塔诺 &#xff08; SebastinScarano&#xff09;参加了红帽网络研讨会LETS PLAY&#xff01; 在…

matlab13节点线路模型,13节点配电网的建模与仿真.doc

..大学生课外创新实验竞赛总结报告项目简介&#xff1a;在配电网的正常运行中&#xff0c;随着用电负荷的变化和系统运行方式的改变&#xff0c;网络中的损耗也将发生变化。要严格保证所有的用户在任何时刻都有额定的电压是不可能的&#xff0c;因此配电网的某个节点电压偏移额…

C语言 · 未名湖边的烦恼

问题描述每年冬天&#xff0c;北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋&#xff0c;可是人太多了&#xff0c;每天下午收工后&#xff0c;常常一双冰鞋都不剩。每天早上&#xff0c;租鞋窗口都会排起长龙&#xff0c;假设有还鞋的m个&#xff0c;有需要租鞋的n…

可视化Java 9模块关系

正如我在之前的文章中所述 &#xff0c;我已经在Java 9 Jigsaw构建上运行Eclipse Neon了一段时间&#xff0c;并且没有任何问题。 我在周末花费了几个小时来修改一些模块化工具的想法。 我为Eclipse Neon写了一个小插件&#xff0c;可视化了各个模块之间的连接。 现在的实现…

matlab怎么整合成一个模块,Matlab如何将m文件制定成模块

代码拷过去&#xff01;可以运行了&#xff0c;记得参数设置界面什么也不用加&#xff01;初始输入记得加入&#xff0c;不然你的S模块会报错&#xff0c;因为你有个reallog函数&#xff01;function [sys,x0,str,ts] guangfu(t,x,u,flag)switch flag,case 0,[sys,x0,str,ts]m…

使用EF Oracle实现DevExpress绑定大数据的ServerMode模式

前提&#xff1a;需要引入EntityFramework组件&#xff0c;注意几个使用点后使用上其实比较简单。 一、引入Oracle EF支持组建 1、可手动引入附件中的DLL&#xff08;需手动合并web.config配置&#xff09; 2、也可使用NuGet的安装方式&#xff0c;安装时会自动合并配置到web.c…

String Start!

(1)Ransom Note 解题思路&#xff1a; 题目叫做Ransom Note&#xff0c;勒索信。勒索信&#xff0c;为了不暴露字迹&#xff0c;就从杂志上搜索各个需要的字母&#xff0c;组成单词来表达的意思。这样来说&#xff0c;题目也就清晰了&#xff0c;判断杂志上的字是否能够组成勒索…

matlab产生m序列,matlab生成m序列的函数

原来那个效率太低&#xff0c;主要是因为实际应用并不需要生成太长的m序列&#xff0c;加入了需求长度&#xff0c;能有效减少运行时间。25级的移位寄存器&#xff0c;运行了一个小时都没有出来一周期&#xff0c;我仅仅需要三千bit而已。改进版&#xff1a;function [seq]mseq…

mac memcached_Mac OS X上的Java Memcached

mac memcached介绍 在本文中&#xff0c;我将解释如何&#xff1a; 在Mac OS X上安装和配置Memcached 在Java应用程序中使用Memcached 我不会过多地介绍在您的应用程序中使用分布式缓存的好处&#xff0c;但至少让我们提供一些在企业门户&#xff08;在我的情况下为eXo平台&…

json日期转换

//调用 ChangeDateFormat(CreatTime) //json日期转换 function ChangeDateFormat(jsondate) { jsondate jsondate.replace("/Date(", "").replace(")/", ""); if (jsondate.indexOf("") > 0) { jsondate jsondate.subs…

物料分拣系统matlab仿真,自动物料分拣机器人控制系统设计+Matlab源程序+图纸

自动物料分拣机器人控制系统设计Matlab源程序图纸时间:2019-07-12 22:29来源:毕业论文在设计中各个极限位置都会设置有传感器来作为边界的报警信号。以此来防止将会因为智能控制的错误带来的危险的事故。而本课题带来的设计是简而言之就是使用虚拟样机技术在虚拟设计总说明&…

JBoss EAP 7快速入门

现在&#xff0c; 最新的Red Hat JBoss企业应用平台7的beta版已经发布&#xff0c;现在是时候探索可用的Java EE 7 快速入门并使用JBoss Developer Studio &#xff08;JDBS&#xff09;部署您的第一个应用程序了。 快速入门演示了JBoss EAP&#xff0c;Java EE 7和一些其他技…

java instantiation,Instantiation of List (Java)

动机今天刷Leetcode时碰到的一道问题(216. Combination Sum III)&#xff1a;Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.给出的func…

Linux基础练习题(二)

Linux基础练习题(二) 1、复制/etc/skel目录为/home/tuer1&#xff0c;要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [rootwww ~]# cp -r /etc/skel/ /home/tuser1 [rootwww ~]# chmod -R 600 /home/tuser1/ 2、编辑/etc/group文件&#xff0c;添加组hado…

java 多线程写缓存,Java多线程_缓存对齐

1.什么是缓存对齐当前的电脑中&#xff0c;数据存储在磁盘上&#xff0c;可以断电保存&#xff0c;但是读取效率较低。不断电的情况下&#xff0c;数据可以在内存中存储&#xff0c;相对硬盘效率差不多是磁盘的一万倍左右。但是运算时&#xff0c;速度最快的是直接缓存在CPU中的…

ArcGIS Server SOE开发之奇怪异常:

添加之后结果显示如下:fjsontokenezkBvir0Tj5q31UEst7pTFPwrwocmHklCajKeh-xXM91qWdBXDuQMmtGcaHaaXCJ 具体如下: 该SOE扩展在另一台机器上测试时可以正常添加,不知道为什么,在此台机器上添加时就出现如下异常. 请教群里大神,大神建议换个浏览器试试,换成IE在添加扩展,竟然成功…

netbeans7.4_NetBeans 7.2引入了TestNG

netbeans7.4代码生成的优点之一是能够查看如何使用特定的语言功能或框架。 正如我在《 NetBeans 7.2 beta&#xff1a;更快&#xff0c;更有用》一文中所讨论的那样&#xff0c; NetBeans 7.2 beta提供了TestNG集成 。 除了对该功能的单一引用之外&#xff0c;我在该帖子中没有…