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 –生成和验证令牌–示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 可视化_可视化Java 9模块
- 下一篇: lambda 分类聚合_使用Java 8