メインコンテンツまでスキップ

Java JWT 検証例

⚠️ 重要なお知らせ: これはデモンストレーション目的の基本的な例です。実運用で使用する際は、ソフトウェアスタック、セキュリティ要件、デプロイ環境に特化したベストプラクティスを調査し、実装してください。常に組織のセキュリティガイドラインに従い、確立されたJWTライブラリやフレームワークの使用を検討してください。

📝 注意: この例は教育目的でJWKSのダウンロードとファイルキャッシングを示しています。実運用環境では、インフラストラクチャに基づいて、構成管理、環境変数、または好みのキャッシング戦略を使用してJWKSキー管理を実装することを選択できます。

この例は、Javaを使用してRokt JWTトークンを検証する方法を示しています。

前提条件

pom.xmlに次の依存関係を追加します:

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

完全な例

package com.rokt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.ECPublicKeySpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
import java.util.Base64;
import java.util.Date;

public class RoktJwtValidator {

// 概要ページからテストトークンをコピー
private static final String SAMPLE_JWT_TOKEN = "PASTE_TEST_TOKEN_HERE";

// JWKS エンドポイント URL
private static final String JWKS_URL = "https://public-api.rokt.com/.well-known/jwks.json";

public static void main(String[] args) {
try {
System.out.println("=== Java JWT バリデーター ===");
System.out.println("トークン: " + SAMPLE_JWT_TOKEN.substring(0, 50) + "...");
System.out.println("JWKS URL: " + JWKS_URL);
System.out.println();

// JWKS をダウンロードしてキャッシュ
String jwksJson = downloadAndCacheJWKS(JWKS_URL, JWKS_CACHE_FILE);
System.out.println("JWKS のダウンロードとキャッシュに成功しました");

// JWKS から公開鍵の座標を抽出
String[] coordinates = extractKeyCoordinates(jwksJson);
String xCoordinate = coordinates[0];
String yCoordinate = coordinates[1];

// JWK 座標から ECDSA 公開鍵を作成
Key publicKey = createECDSAPublicKey(xCoordinate, yCoordinate);

// JWT トークンを検証
Claims claims = validateJWT(SAMPLE_JWT_TOKEN, publicKey);

System.out.println("✅ トークンの検証に成功しました!");
System.out.println("キャンペーン ID: " + claims.get("cid"));
System.out.println("クリエイティブ ID: " + claims.get("crid"));
System.out.println("RCLID: " + claims.get("rclid"));
System.out.println("発行日時: " + new Date(claims.getIssuedAt().getTime()) + " UTC");"

} catch (Exception e) {
System.err.println("❌ トークンの検証に失敗しました: " + e.getMessage());
e.printStackTrace();
}
}

private static Claims validateJWT(String token, Key publicKey) {
return Jwts.parserBuilder()
.setSigningKey(publicKey)
.setAllowedClockSkewSeconds(60) // 1分の時計のずれを許可
.build()
.parseClaimsJws(token)
.getBody();
}

private static Key createECDSAPublicKey(String xCoordinate, String yCoordinate) throws Exception {
// base64urlエンコードされた座標をデコード
byte[] xBytes = Base64.getUrlDecoder().decode(xCoordinate);
byte[] yBytes = Base64.getUrlDecoder().decode(yCoordinate);

// BigIntegerに変換
BigInteger x = new BigInteger(1, xBytes);
BigInteger y = new BigInteger(1, yBytes);

// AlgorithmParametersから標準のP-256曲線を使用
java.security.AlgorithmParameters parameters = java.security.AlgorithmParameters.getInstance("EC");
parameters.init(new java.security.spec.ECGenParameterSpec("secp256r1"));
ECParameterSpec ecParameterSpec = parameters.getParameterSpec(ECParameterSpec.class);

// ECDSA公開鍵仕様を作成
ECPublicKeySpec spec = new ECPublicKeySpec(
new ECPoint(x, y),
ecParameterSpec
);

// 公開鍵を生成
KeyFactory keyFactory = KeyFactory.getInstance("EC");
return keyFactory.generatePublic(spec);
}
}

入力/出力例

入力

  • JWTトークン: Overviewページからテストトークンをコピー
  • 公開鍵ソース: https://public-api.rokt.com/.well-known/jwks.json

出力

=== Java JWTバリデーター ===
トークン: eyJhbGciOiJFUzI1NiIsImtpZCI6InJva3Qtc2lnbmluZy1rZX...
JWKS URL: https://public-api.rokt.com/.well-known/jwks.json

ダウンロード中: https://public-api.rokt.com/.well-known/jwks.json
JWKSをキャッシュに保存: jwks_cache.json
JWKSのダウンロードとキャッシュが成功しました

✅ トークンの検証に成功しました!
キャンペーンID: 3436085368692408324
クリエイティブID: 3437732754935906308
RCLID: 7db958dbd232247a4a8285a34d22fe0f4e9affa463bf5ee54e26721ab0df0e23
発行日時: Wed Aug 20 15:10:01 AEST 2025 UTC

実行方法

Mavenを使用する場合(推奨)

  1. pom.xmlでMavenプロジェクトを作成:
<?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.rokt</groupId>
<artifactId>jwt-validator</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
  1. コードをsrc/main/java/com/rokt/RoktJwtValidator.javaに保存
  2. 実行: mvn compile exec:java -Dexec.mainClass="com.rokt.RoktJwtValidator"

JARファイルを直接使用する

  1. JJWT JARファイルをダウンロード
  2. コードをRoktJwtValidator.javaに保存
  3. コンパイル: javac -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator.java
  4. 実行: java -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator

注意事項

  • 公開鍵はRoktのJWKSエンドポイントから取得されます

  • この例では署名検証にECDSA-256 (ES256)アルゴリズムを使用しています

  • パフォーマンスのために公開鍵をキャッシュすることを検討してください

この記事は役に立ちましたか?