JWT使用 - Spring Security OAuth使用JWT测试

本文详细介绍了如何在Spring Cloud项目中实现JWT认证,包括引入安全和OAuth2依赖、配置密钥库、创建JWT令牌及验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

 

第二步:添加keystore到resources文件夹下

位置为:src\main\resources\app.keystore

src\main\resources\publickey.txt

 

第三步:配置application.yml

encrypt:
  key-store:
    location: classpath:/app.keystore
    secret: app123
    alias: edukey
    password: edu123

第四步:创建测试类,代码如下:

package com.test;

import com.alibaba.fastjson.JSON;
import com.xuecheng.auth.UcenterAuthApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.RsaSigner;
import org.springframework.security.jwt.crypto.sign.RsaVerifier;
import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
import org.springframework.test.context.junit4.SpringRunner;

import javax.servlet.ServletOutputStream;
import javax.sound.midi.Soundbank;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashMap;
import java.util.Map;

/**
 * xxx.keystore
 *
 *
 */
@SpringBootTest(classes = UserAuthApplication.class)
@RunWith(SpringRunner.class)
public class TestJWT {

    private static final String PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmt5IvJZoMUpSMLw6YCPACr+qpfyjwHy6t4MUxFsya00wEOTyisMvAclu56u7PPnCYUaLOXfrnMQe2L+J0aIxRL/KFfGJ0Z3+W4AqPetPgq/ebFABcln5uXI7IR6QCBgvl2d7NVrJqUm5ahjb3DHhV0rjmEWIEAhdsHur4kR6fTdikOcsUtC4h38KmivfLIlfNbG8YbwOmgGUqDjFf7E3szIzFEaRs2OhcrWxYeIKlUALVR5pkdnGJ8BXRxT4AUPRQvF3gh9o/jnbdJEIlr840bfJ11ZEEszXhxOCSE00aeM2bIOYjuObvNm2urLUCd84074L6jfwIzujwZ9gjcJANwIDAQAB-----END PUBLIC KEY-----";



    /**
     * 创建 JWT 令牌
     */
    @Test
    public void testCreateJWT() {

        // 密钥库文件:
        String keystore = "app.keystore";

        // 密钥库密码:app123
        String keystore_passowrd = "app123";

        // 密钥别名:edukey
        String alias = "edukey";

        // 密钥的访问密码
        String key_password = "edu123";


        // 密钥库文件路径
        ClassPathResource classPathResource = new ClassPathResource(keystore);
        // 密钥工厂
        KeyStoreKeyFactory keyStoreFactory = new KeyStoreKeyFactory(classPathResource, keystore_passowrd.toCharArray());
        // 获取密钥对(公钥+私钥)
        KeyPair keyPair = keyStoreFactory.getKeyPair(alias,key_password.toCharArray());

        // 获取私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

        // JWT 令牌内容
        Map<String,String> body = new HashMap<String,String>();
        body.put("name","jwt123abc");
        String bodyString = JSON.toJSONString(body);
        // 生成jwt令牌
        Jwt jwt = JwtHelper.encode(bodyString,new RsaSigner(privateKey));

        // 生成JWT令牌编码
        String encoded = jwt.getEncoded();

        System.out.println("jwt令牌:" + encoded);

        // jwt令牌:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiand0MTIzYWJjIn0.TSO2pIkmCI42cW3jC3gnj82p4P7EC1g88asY4A7ldUAH9gkIOq9u0c3D1gx4QQgPBSKUMxmhOdIiYOThng648svVWLxXttTdonnh0R0BdHVJYQrTfXiDvFi89bMfVRa7XJtrZwCUPxFrkJJMliEhNfhh8wyg_mqbtNK8rHB1tMTb9LM6iyd50fQ8Rn_yq_W3y-CggerrrzceM58OD9QpmTZkeuong007wMqCm_NwZ-5aYUv4-q4h8C1UkE-2CGeDEwiPDifge7k1IAPIoXHcElsZk-aKO7tTmOb_s-yV2jQeEMNjMDI-UXPwqCKACSCxhPMD6L0CTk18sBjVqjS-GQ

    }

    // 校验JWT令牌
    @Test
    public void testVerifyJWT() {
        // 公钥:
        String publicKey = PUBLIC_KEY;
        // 令牌
        String jwtToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiand0MTIzYWJjIn0.TSO2pIkmCI42cW3jC3gnj82p4P7EC1g88asY4A7ldUAH9gkIOq9u0c3D1gx4QQgPBSKUMxmhOdIiYOThng648svVWLxXttTdonnh0R0BdHVJYQrTfXiDvFi89bMfVRa7XJtrZwCUPxFrkJJMliEhNfhh8wyg_mqbtNK8rHB1tMTb9LM6iyd50fQ8Rn_yq_W3y-CggerrrzceM58OD9QpmTZkeuong007wMqCm_NwZ-5aYUv4-q4h8C1UkE-2CGeDEwiPDifge7k1IAPIoXHcElsZk-aKO7tTmOb_s-yV2jQeEMNjMDI-UXPwqCKACSCxhPMD6L0CTk18sBjVqjS-GQ";

        // 校验 JWT 令牌
        Jwt jwt = JwtHelper.decodeAndVerify(jwtToken, new RsaVerifier(publicKey));

        // 获取 JWT 令牌中封装的自定义内容
        String claims = jwt.getClaims();

        System.out.println("jwt自定义内容:" + claims);


    }




}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值