auth0.jwt生成token

生成公钥私钥,并存储到resource

        const val ALGORITHM = "RSA"
        const val PRIVATE_KEY_PATH = "KEY/licensePrivate.key"
        const val PUBLIC_KEY_PATH = "KEY/licensePublic.key"
        
        val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM)
        val keyPair = keyPairGenerator.generateKeyPair()
        val publicKey = keyPair.public
        val privateKey = keyPair.private
        val publicKeyByte = publicKey.encoded
        val privateKeyByte = privateKey.encoded
        val publicKeyString = Base64.encode(publicKeyByte)
        val privateKeyString = Base64.encode(privateKeyByte)
        var fos = FileOutputStream(PUBLIC_KEY_PATH)
        fos.write(publicKeyString.toByteArray())
        fos.flush()
        fos = FileOutputStream(PRIVATE_KEY_PATH)
        fos.write(privateKeyString.toByteArray())
        fos.flush()
        fos.close()

从本地获取公钥私钥

//EncodedKeySpec的实现有所不同,私钥是PKCS8EncodedKeySpec,公钥是X509EncodedKeySpec
fun getPirvateKey(): PrivateKey {
        val resourceAsStream = Companion::class.java.classLoader.getResourceAsStream(PRIVATE_KEY_PATH)
        val privateKeyString = resourceAsStream?.readAllText()
        resourceAsStream?.close()
        val privateKeyByte = Base64.decode(privateKeyString)
        val pkcS8EncodedKeySpec = PKCS8EncodedKeySpec(privateKeyByte) 
        val keyFactory = KeyFactory.getInstance(ALGORITHM)
        return keyFactory.generatePrivate(pkcS8EncodedKeySpec)
    }
fun getPublicKey(): PublicKey {
        val resourceAsStream = Companion::class.java.classLoader.getResourceAsStream(PUBLIC_KEY_PATH)
        val publicKeyString = resourceAsStream?.readAllText()
        resourceAsStream?.close()
        val publicKeyByte = Base64.decode(publicKeyString)
        val x509EncodedKeySpec = X509EncodedKeySpec(publicKeyByte)
        val keyFactory = KeyFactory.getInstance(ALGORITHM)
        return keyFactory.generatePublic(x509EncodedKeySpec)
    }

生成token

        val algorithm: Algorithm = Algorithm.RSA256(getPublicKey() as RSAPublicKey, getPirvateKey() as RSAPrivateKey)
        val token = JWT.create()
            .withIssuedAt(Date()) //生成时间
            .withExpiresAt(SimpleDateFormat(DATE_FORMAT).parse(command.expireTime)) //过期时间
            .withClaim("info", command.toJson().toString()) //claim是自定义的负载信息
            .sign(algorithm)

解析token

		val decode = JWT.decode(license)
        val dataStr = decode.claims["info"]!!.asString()
        val data = JSONUtil.parseObj(dataStr)
<think>嗯,用户想了解com.auth0.jwt.JWT包里的withAudience()方法。首先,我需要回忆一下JWT的结构,它由头部、载荷和签名组成。载荷里的aud字段是受众,也就是这个令牌的目标接收者。 withAudience()方法应该是在JWT的构建过程中用来设置aud声明的。可能有两种参数类型,比如接受一个字符串或者多个字符串。不过根据常见的JWT库设计,可能有多个方法重载。 接下来,我需要确认这个方法的用途。aud用于标识令牌的预期接收者,服务端在验证时会检查这个值是否匹配,这样可以增加安全性,防止令牌被错误的使用。 然后,参数部分可能有不同的形式,比如单个字符串、字符串数组或者可变参数。需要说明传入多个受众的情况,但实际应用中aud可以是数组或字符串,根据规范处理。 示例代码部分,需要展示如何用withAudience()构建JWT,可能包括创建Token、设置声明、签名并生成令牌。还要提到验证时如何检查aud值,比如使用requireAudience()方法。 注意事项方面,可能需要强调aud是可选的,但推荐使用以增强安全性。另外,避免敏感信息,正确传递和验证aud值的重要性。 现在要确保语法正确,比如方法名的大小写,参数类型的正确性。还要检查是否漏掉了重要细节,比如方法属于JWTVerifier还是JWTBuilder。根据经验,withAudience()通常是JWTBuilder的方法,用于构建令牌时设置声明。 最后,确保用中文清晰分步骤解释,结构符合用户要求,使用代码示例,并给出验证时的对应方法。避免技术错误,比如参数类型的误解,或者方法归属类的错误。</think>我来分步为您讲解 `com.auth0.jwt.JWT` 包中的 `withAudience()` 方法: 1. **方法定位** - 属于 `JWT.Builder` 类(JWT令牌构建器) - 用于设置JWT的`aud`(Audience)声明字段 2. **核心功能** ```java JWT.create().withAudience("api.example.com"); ``` - 定义令牌的目标接收方(服务端可验证此值) - 支持链式调用,可与`.withIssuer()`等方法组合使用 3. **参数类型** - 单受众模式:`withAudience(String audience)` - 多受众模式:`withAudience(String... audience)` ```java // 设置多个受众 JWT.create().withAudience("webapp", "mobileapp", "admin"); ``` 4. **验证阶段对应方法** ```java JWTVerifier.requireAudience("webapp") // 验证时检查受众 ``` 5. **安全实践建议** - 建议为不同客户端设置不同`aud`值(如 web/mobile 端区分) - 服务端验证时应严格匹配`aud`值 - 避免在此字段存储敏感信息 6. **技术规范对照** - 符合RFC 7519标准中关于`aud`声明的定义 - 当设置多个值时,会存储为JSON数组格式: ```json { "aud": ["serviceA", "serviceB"] } ``` 7. **典型使用场景** - API网关验证客户端类型 - 微服务间鉴权时标识目标服务 - 区分同一系统的不同子系统访问权限 验证失败时会抛出`JWTVerificationException`异常,建议配合try-catch处理验证逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值