使用AuthJwt签名认证Jwt

前置知识

对称加密、非对称加密、用户鉴权、HTTPS

HTTPS到底有多复杂,能防止重放攻击吗? - 知乎

https到底把什么加密了? - 知乎

HTTPS可以防范中间人攻击、防窃听等。但不能防范CSRF

CSRF (跨站请求伪造):诱导用户点击访问经过伪装的某些网站URL,假设用户已经和该网站建立了认证,则这次访问,服务器会认为是用户发起的。

「每日一题」CSRF 是什么? - 知乎

Jwt

JSON Web Tokens - jwt.io

使用AuthJwt签名认证Jwt_第1张图片

使用AuthJwt签名认证Jwt_第2张图片

JWT JSON Web Token, json化的网络签名。

其内容主要分为3段,header(头信息) + payload(载荷) + signature(签名)。

其中header 与 payload 为经过base64的明文。里面不能放置敏感信息。

signature为使用密钥加密后的签名(不可解密),用于token认证。

 AuthJwt使用

github地址 

https://github.com/auth0/java-jwt

Maven依赖


    com.auth0
    java-jwt
    3.18.2

签名token

try {
    // 封装好密钥的加密算法
    Algorithm algorithm = Algorithm.HMAC256("secret");
    Date expiredTime = new Date(System.currentTimeMillis() + TTL);
    String token = JWT.create()
        // 签名方
        .withIssuer("auth0")
        // 设置自定义的载荷信息。jwt用claim表示这种k\v结构的信息
        .withClaim("name", "yourname")
        // 过期时间设置
        .withExpiresAt(expiredTime)
        // 使用指定的加密算法加密签名
        .sign(algorithm);
} catch (JWTCreationException exception){
    //Invalid Signing configuration / Couldn't convert Claims.
}

认证解析token

// Example using HS256

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    Algorithm algorithm = Algorithm.HMAC256("secret");
    JWTVerifier verifier = JWT.require(algorithm)
        .withIssuer("auth0")
        .build(); //Reusable verifier instance
    DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
    //Invalid signature/claims
}



// Example using RS256
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
RSAPublicKey publicKey = //Get the key instance
RSAPrivateKey privateKey = //Get the key instance
try {
    Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
    JWTVerifier verifier = JWT.require(algorithm)
        .withIssuer("auth0")
        .build(); //Reusable verifier instance
    DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
    //Invalid signature/claims
}

解析获取载荷信息


String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    DecodedJWT jwt = JWT.decode(token);
    String user = jwt.getClaim("name").asString();
    String iss = jwt.getIssuer();
    String date = jwt.getExpiresAt();

    // use iss and personal claim message to do real work !

} catch (JWTDecodeException exception){
    //Invalid token
}

// ps 使用前面verify一样可以获取到 DecodedJWT jwt

补充知识

RSA加密

RSA 非对称加密原理(小白也能看懂哦~)_jijianshuai的专栏-CSDN博客

使用JWT+RSA实现单点登陆

如何使用JWT和RSA非对称加密进行授权认证单点登录_老白酒,用心酿的博客-CSDN博客

其他参考

JJWT使用笔记(一)—— JWT token的生成 - 简书

使用auth0构建JWT - 简书

你可能感兴趣的:(Java8,开发环境搭建,开源框架,java,jwt,web安全,https,rsa)