Jose4jJwtGenerator.java

package io.extact.rms.platform.jwt.impl.jose4j;

import static io.extact.rms.platform.jwt.impl.jose4j.KeyCreators.*;
import static org.jose4j.jws.AlgorithmIdentifiers.*;

import java.util.ArrayList;

import jakarta.inject.Inject;

import org.eclipse.microprofile.config.Config;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
import org.jose4j.lang.JoseException;

import io.extact.rms.platform.extension.ConfiguableScoped;
import io.extact.rms.platform.jwt.JwtConfig;
import io.extact.rms.platform.jwt.provider.JsonWebTokenGenerator;

@ConfiguableScoped
public class Jose4jJwtGenerator implements JsonWebTokenGenerator {

    private JwtConfig jwtConfig;

    @Inject
    public  Jose4jJwtGenerator(Config config) {
        this.jwtConfig = JwtConfig.of(config);
    }

    @Override
    public String generateToken(UserClaims userClaims) {

        var jws = new JsonWebSignature(); // 署名オブジェクト

        JwtClaims claims = createClaims(userClaims);
        jws.setPayload(claims.toJson());
        jws.setAlgorithmHeaderValue(HMAC_SHA256);
        jws.setKey(jwtConfig.getSecretKey(PHRASE_TO_KEY_CONVERTER));
        jws.setDoKeyValidation(false);

        try {
            // ClaimsのJSONを秘密鍵で署名
            return jws.getCompactSerialization();
        } catch (JoseException e) {
            throw new IllegalStateException(e);
        }
    }


    // ----------------------------------------------------- inner classes

    private JwtClaims createClaims(UserClaims userClaims) {

        // MicroProfile-JWTで必須とされている項目のみ設定
        var claims = new JwtClaims();

        // 発行者
        claims.setIssuer(jwtConfig.getIssuer());
        // ユーザ識別子
        claims.setSubject(userClaims.getUserId());
        // 有効期限(exp)
        claims.setExpirationTimeMinutesInTheFuture(jwtConfig.getExpirationTime());
        // 発行日時(iat)
        if (jwtConfig.isIssuedAtToNow()) {
            claims.setIssuedAtToNow();
        } else {
            claims.setIssuedAt(NumericDate.fromSeconds(jwtConfig.getIssuedAt()));
        }
        // tokenId(jti)
        claims.setGeneratedJwtId();
        // ユーザ名(MicroProfile-JWTのカスタムClaim)
        claims.setStringClaim("upn", userClaims.getUserPrincipalName());
        // グループ名(MicroProfile-JWTのカスタムClaim)
        claims.setStringListClaim("groups", new ArrayList<>(userClaims.getGroups()));

        return claims;
    }
}