JWT (JSON Web Token) — это стандарт с открытым исходным кодом, который обычно используется для компактной и безопасной передачи данных между двумя службами. Информация, передаваемая между службами, может быть проверена и доверена, поскольку она имеет цифровую подпись.

Структура веб-токена JSON (JWT)

Заголовок

  • Algorithm — Используемый алгоритм хеширования
  • Например: RS256, HS256, HS384, HS512, RS384, PS384, ES256 и т. д.
  • Тип — Тип токена.
  • Пример: JWT
  • Цепочка сертификатов
  • Пример: x5c -> Цепочка сертификатов X.509

Полезная нагрузка

  • iss — Эмитент
  • sub — Тема
  • aud — Аудитория
  • exp — срок действия
  • iat — выпущено в
  • jti — идентификатор JWT
  • so on…

Подпись

  • Закодированный заголовок
  • Закодированная полезная нагрузка
  • Секрет
  • Алгоритм и знак

Создать токен JWT

Ниже класс JsonReader читает файл Json, содержащий всю полезную нагрузку, заголовок и закрытый ключ для хранения в классе компонента.

Настраивать

Зависимость от Maven.

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
    </dependencies>

Полезная нагрузка чтения и информация заголовка из файла JSON.

package com.jwt.oauth;
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonReader {
    public CertJsonBean readJsonFile() {
        ObjectMapper objectMapper;
        try {
            ObjectMapper mapper = new ObjectMapper();
            objectMapper = new ObjectMapper();
            CertJsonBean cert = objectMapper.readValue(new File("src/main/java/data/hsm_cert.json"), CertJsonBean.class);
            return cert;
        } catch (IOException ie) {
            ie.printStackTrace();
        }
        return null;
    }
}

Вот класс компонента, в котором есть все геттеры и сеттеры.

package com.jwt.oauth;
import java.util.*;
public class CertJsonBean {
    public String privatekey;
    public Map<String, Object> payload;
    public Map<String, Object> header;
    public String getPrivatekey() {
        return privatekey;
    }
    public void setPrivatekey(String privatekey) {
        this.privatekey = privatekey;
    }
    public Map<String, Object> getPayload() {
        return payload;
    }
    public void setPayload(Map<String, Object> payload) {
        this.payload = payload;
    }
    public Map<String, Object> getHeader() {
        return header;
    }
    public void setHeader(Map<String, Object> header) {
        this.header = header;
    }
    @Override
    public String toString() {
        return "CertJsonBean{" +
                "privatekey='" + privatekey + '\'' +
                ", payload=" + payload +
                ", header=" + header +
                '}';
    }
}

Создайте закрытый ключ из ключа String.

private PrivateKey getPrivateKey(String privateKey) throws Exception {
        // Read in the key into a String
        StringBuilder pkcs8Lines = new StringBuilder();
        BufferedReader rdr = new BufferedReader(new StringReader(privateKey));
        String line;
        while ((line = rdr.readLine()) != null) {
            pkcs8Lines.append(line);
        }
        // Remove the "BEGIN" and "END" lines, as well as any whitespace
        String pkcs8Pem = pkcs8Lines.toString();
        pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replaceAll("\\s+", "");
        // Base64 decode the result
        byte[] pkcs8EncodedBytes = Base64.getDecoder().decode(pkcs8Pem);
        // extract the private key
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey privKey = kf.generatePrivate(keySpec);
        return privKey;
    }

Создайте токен JWT, передав данные Json методу

public String generateToken(CertJsonBean certJsonBean) {
        String token = null;
        String privateKey;
        Map<String, Object> header = new HashMap<String, Object>();
        Map<String, Object> payload = new HashMap<String, Object>();
        try {
            privateKey = certJsonBean.privatekey;
            payload = certJsonBean.payload;
            header = certJsonBean.header;
            // get the private key from encoded key.
            PrivateKey pvtKey = getPrivateKey(privateKey);
            if (!certJsonBean.privatekey.isEmpty()) {
                token = Jwts.builder().setClaims(payload).setHeader(header).signWith(pvtKey, SignatureAlgorithm.RS256).compact();
            } else {
                token = "Something went wrong!!";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return token;
    }

Основной метод создания токена.

public static void main(String[] args) throws Exception {
        JwtTokenCreator jwtTokenCreator = new JwtTokenCreator();
        JsonReader jsonReader = new JsonReader();
        CertJsonBean certJsonBean = jsonReader.readJsonFile();
        String token = jwtTokenCreator.generateToken(certJsonBean);
        System.out.println(token);
    }

Проверка токена JWT

private void verifyToken(String token, PublicKey publicKey) {
        Claims claims;
        try {
            claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token).getBody();
            System.out.println(claims.get("iss"));
            System.out.println(claims.get("sub"));
        } catch (Exception e) {
            claims = null;
        }
    }

Вывод

Currently, there are several standardized security approaches (session cookie, HTTP Basic, and HTTP Digest) will work with REST services as well, they all have problems that would be nice to avoid by using a better standard. JWT is another approach to save the problem.
JWT’s main strength is handling user authentication in a stateless, and there

Больше сообщений можно найти на: https://buzzform.com