jwt令牌_JWT –生成和验证令牌–示例

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

jwt令牌

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

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

相关文章

linux 二进制差分工具,打造Android万能的软件更新库

今日科技快讯阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止APP内的音乐服务,用户可以通过新版本内的指引和说明,导出本地音乐。这意味着上线八个月后,阿里星球做出了一个重大决定:停止音乐服务后&#xff…

jboss eap 7_JBoss EAP 7快速入门

jboss eap 7现在, 最新的Red Hat JBoss企业应用平台7的beta版已经发布,现在是时候探索可用的Java EE 7 快速入门并使用JBoss Developer Studio (JDBS)部署您的第一个应用程序了。 快速入门演示了JBoss EAP,Java EE 7和…

lambda 分类聚合_使用Java 8 Lambda,流和聚合

lambda 分类聚合总览 在本文中,我们将介绍使用Java 8 lambda,流和聚合来过滤和处理Collection中的对象。 这篇文章中的所有代码都可以在此处的 BitBucket中找到 。 对于此示例,我们将创建许多对象,这些对象代表我们IT基础架构中的…

linux下kegg注释软件,KEGG功能注释工具 KofamKOALA 安装与使用

KEGG数据库,即京都基因和基因组百科全书(Kyoto Encyclopedia of Genes and Genomes),是系统分析基因功能、基因组信息的数据库。KofamKOALA是一个方便的KEGG功能注释工具,由创建KEGG的京都大学化研所生物信息中心学者在2019年11月发表于Bioin…

jooq_jOOQ API设计缺陷的怪异事件

jooqjOOQ是内部特定于域的语言(DSL) ,它以Java(宿主语言)建模SQL语言(外部DSL)。 这篇热门文章描述了jOOQ API的主要机制: Java Fluent API设计器速成课程 。 任何人都可以根据该文…

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成:2 使用Systemback生成镜像文件输入管理员密码,打开后界面以…

黑马2016java_2016年成功的Java开发人员简介

黑马2016java2015年即将结束。 现在该总结过去一年中已完成的工作和未完成的工作。 此外,现在是预测下一个2016年的好时机。 您已经猜到这篇文章是关于2016年理想的Java开发人员的。 我想给你一个惊喜,这次我更改了预测的格​​式。 为了使预测更加客观…

红帽子linux笔试题,redhat-linux面试题

redhat-linux面试题1. 在Linux系统中,以 _文件__ 方式访问设备 。2. Linux内核引导时,从文件 /etc 中读取要加载的文件系统。3. Linux文件系统中每个文件用_节点__来标识。4. 链接分…

lambda设计模式_使用lambda的装饰器设计模式

lambda设计模式随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码。 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能。 展望未来,我认为下一步是重新访问完善的设计模式&#xff…

linux监控nginx占用,使用zabbix 2.4 监控nginx

1、获取 Nginx 状态( HTTP Stub Status )/usr/local/nginx/sbin/nginx -V2、配置 nginx.confvim /usr/local/nginx/conf/nginx.conflocation ~ /nginx_status {stub_status on;access_log off;allow 127.0.0.1;allow 192.168.1.14;deny all;}3、编写脚本获取上面的 key 值vim /…

如何使用java代码生成_使用Java成功生成代码的7个技巧

如何使用java代码生成作为介绍,最近我有点安静,部分原因是我一直在忙于Chronicle-FIX的工作 。 这是Chronicle-Enterprise套件中的一个新的超低延迟库,我们证明了该库可以在低个位数微秒内解析和存储消息。 当然,它利用了我们的开…

多核 linux 绑定,Linux 操作系统下CPU多核心的绑定

现在多CPU的趋势越来越大了. 有时候为了更好地操作机器, 需要将某个进程绑定到具体的CPU上去. 下面给出了一个进程绑定到具体的CPU上去的一个例子.cpu.c[CODE]#include#include#include#include#include#define __USE_GNU#include#include#includeint main(int argc, char* arg…

java键盘事件键值表_Java的20年:重大事件的时间表

java键盘事件键值表翻译自: https://www.javacodegeeks.com/2015/12/2-decades-java-timeline-notable-events.htmljava键盘事件键值表

c语言printf到指定文件,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

spring一站式开发_Spring开发人员知道的一件事

spring一站式开发在最近的(核心)Spring框架培训课程中,有人问我:“(Java)Spring开发人员应该知道的一件事是什么?” 这个问题使我措手不及。 是的,(核心)Spri…

c语言十六进制转换加H,c语言十六进制和十进制间的转换.docx

集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)c语言十六进制和十进制间的转换1.将十六进制转换为十进制.#include#includeint main(void){int convert(int,char *);int i,j;char …

jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

jax-ws和jax-rs1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的We…

c command语言学例子,语言学第四章

《语言学第四章》由会员分享,可在线阅读,更多相关《语言学第四章(3页珍藏版)》请在人人文库网上搜索。1、Chapter 4:SyntaxI. Decide whether each of the following statements is True or False:1. Syntax is a subfield of linguistics that studies …

eclipse开发jsf_在Eclipse上创建JSF / CDI Maven项目

eclipse开发jsf当我在研究JSF和CDI示例时,我认为提到创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下,M2E插件随附的Eclipse Luna。 因此,无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->…

apache camel_Apache Camel的性能调整思路

apache camel时不时地,我会以Camel速度较慢的观点来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂,路由引擎全部在内存中,并且不需要任何持久状态。 因此,在99%的情况下,性能问题是由于…