IT袋

当前位置:主页 > 经验教程 > 建站编程 >

常用认证机制有哪些

常用认证机制有哪些 "常见的身份验证方式有哪些?"(4)

时间:2023-11-22 10:23:19 来源:IT袋 作者:马勇
导读:常用认证机制有哪些,6. jwt入门案例 jjwt是一个提供JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。 jjwt的maven坐标: dependency> groupId>io.js

常用认证机制有哪些

6. jwt入门案例

jjwt是一个提供JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。

jjwt的maven坐标:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

6.1. jwt入门案例

本案例中会通过jjwt来生成和解析JWT令牌。

【步骤一】:创建maven工程jwt_demo并配置pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zbbmeta</groupId>
    <artifactId>jwt_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
</project>

【步骤二】:编写单元测试

package com.zbbmeta.test;
import cn.hutool.core.io.FileUtil;
import io.jsonwebtoken.*;
import org.junit.Test;
import java.io.DataInputStream;
import java.io.InputStream;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
public class JwtTest {
    //生成jwt,不使用签名
    @Test
    public void test1(){
        //添加构成JWT的参数
        Map<String, Object> headMap = new HashMap();
        headMap.put("alg", "none");//不使用签名算法
        headMap.put("typ", "JWT");
        Map body = new HashMap();
        body.put("userId","1");
        body.put("username","xiaoming");
        body.put("role","admin");
        String jwt = Jwts.builder()
                .setHeader(headMap)
                .setClaims(body)
                .setId("jwt001")
                .compact();
        System.out.println(jwt);
        //解析jwt
        Jwt result = Jwts.parser().parse(jwt);
        Object jwtBody = result.getBody();
        Header header = result.getHeader();
        System.out.println(result);
        System.out.println(jwtBody);
        System.out.println(header);
    }
    //生成jwt时使用签名算法生成签名部分----基于HS256签名算法
    @Test
    public void test2(){
        //添加构成JWT的参数
        Map<String, Object> headMap = new HashMap();
        headMap.put("alg", SignatureAlgorithm.HS256.getValue());//使用HS256签名算法
        headMap.put("typ", "JWT");
        Map body = new HashMap();
        body.put("userId","1");
        body.put("username","xiaoming");
        body.put("role","admin");
        String jwt = Jwts.builder()
                        .setHeader(headMap)
                        .setClaims(body)
                        .setId("jwt001")
               .signWith(SignatureAlgorithm.HS256,"zbbmeta")
               .compact();
        System.out.println(jwt);
        //解析jwt
        Jwt result = Jwts.parser().setSigningKey("zbbmeta").parse(jwt);
        Object jwtBody = result.getBody();
        Header header = result.getHeader();
        System.out.println(result);
        System.out.println(jwtBody);
        System.out.println(header);
    }
    
        //生成自己的 秘钥/公钥 对
    @Test
    public void test4() throws Exception{
        //自定义 随机密码,  请修改这里
        String password = "zbbmeta";
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        SecureRandom secureRandom = new SecureRandom(password.getBytes());
        keyPairGenerator.initialize(1024, secureRandom);
        KeyPair keyPair = keyPairGenerator.genKeyPair();
        byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
        byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
        FileUtil.writeBytes(publicKeyBytes, "d:\\pub.key");
        FileUtil.writeBytes(privateKeyBytes, "d:\\pri.key");
    }
    
    //生成jwt时使用签名算法生成签名部分----基于RS256签名算法
    @Test
    public void test3() throws Exception{
        //添加构成JWT的参数
        Map<String, Object> headMap = new HashMap();
        headMap.put("alg", SignatureAlgorithm.RS256.getValue());//使用RS256签名算法
        headMap.put("typ", "JWT");
        Map body = new HashMap();
        body.put("userId","1");
        body.put("username","xiaoming");
        body.put("role","admin");
        String jwt = Jwts.builder()
                .setHeader(headMap)
                .setClaims(body)
                .setId("jwt001")
                .signWith(SignatureAlgorithm.RS256,getPriKey())
                .compact();
        System.out.println(jwt);
        //解析jwt
        Jwt result = Jwts.parser().setSigningKey(getPubKey()).parse(jwt);
        Object jwtBody = result.getBody();
        Header header = result.getHeader();
        System.out.println(result);
        System.out.println(jwtBody);
        System.out.println(header);
    }
    //获取私钥
    public PrivateKey getPriKey() throws Exception{
        InputStream resourceAsStream = 
            this.getClass().getClassLoader().getResourceAsStream("pri.key");
        DataInputStream dis = new DataInputStream(resourceAsStream);
        byte[] keyBytes = new byte[resourceAsStream.available()];
        dis.readFully(keyBytes);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePrivate(spec);
    }
    //获取公钥
    public PublicKey getPubKey() throws Exception{
        InputStream resourceAsStream = 
            this.getClass().getClassLoader().getResourceAsStream("pub.key");
        DataInputStream dis = new DataInputStream(resourceAsStream);
        byte[] keyBytes = new byte[resourceAsStream.available()];
        dis.readFully(keyBytes);
        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }
}

上述分享的常用认证机制有哪些的详细方法介绍,大家作为一个参考建议。

相关阅读

  • 服务器安全措施 服务器安全策略怎么做?

    服务器安全措施 服务器安全策略怎么做?

    跟大家聊一聊服务器安全措施方面的介绍,一起来看看吧! 随着互联网技术的发展,服务器已经成为现代社会中不可或缺的一部分。作为企业和组织的重要基础设施之一,服务器安全性也变得

  • 视频是什么格式 常见的网站视频格式后缀都有哪些

    视频是什么格式 常见的网站视频格式后缀都有哪些

    关于常见的网站视频格式后缀都有哪些和视频是什么格式方面的内容,如有不对的地方欢迎指正! 很多人问视频格式的事,今天系统地帮大家整理一下。 视频格式用于存储视频、音频、和字幕

  • OSPFv3设备类型有哪些 OSPFv3有哪些设备类型?

    OSPFv3设备类型有哪些 OSPFv3有哪些设备类型?

    为关注IT袋网网的网友们详解OSPFv3设备类型有哪些方面的知识,请看下面详细的介绍。 在OSPFv3(Open Shortest Path First version 3)协议中,不同的设备扮演着关键的角色,协同工作来构建稳定、高效

  • 如何运用Ruby语言创建一个DNS查询

    如何运用Ruby语言创建一个DNS查询

    今天为大家介绍如何运用Ruby语言创建一个DNS查询的电脑方面的小经验,继续往下看吧! 大家好!前段时间我写了一篇关于“如何用 Go 语言建立一个简易的 DNS 解析器”的帖子。 那篇帖子里我