日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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令牌

總結

以上是生活随笔為你收集整理的jwt令牌_JWT –生成和验证令牌–示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。