Ether Framework
Unified API docs for Ether modules
Loading...
Searching...
No Matches
DefaultTokenIssuer.java
Go to the documentation of this file.
1package dev.rafex.ether.jwt;
2
3/*-
4 * #%L
5 * ether-jwt
6 * %%
7 * Copyright (C) 2025 - 2026 Raúl Eduardo González Argote
8 * %%
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 * #L%
27 */
28
29import dev.rafex.ether.jwt.internal.ClaimsMapper;
30import dev.rafex.ether.jwt.internal.JwtCodec;
31import dev.rafex.ether.jwt.internal.JwtSigner;
32
33import java.util.Objects;
34
35/** Default implementation of {@link TokenIssuer}. */
36public final class DefaultTokenIssuer implements TokenIssuer {
37
38 private final JwtConfig config;
39
40 public DefaultTokenIssuer(final JwtConfig config) {
41 this.config = Objects.requireNonNull(config, "config");
42 validateIssuerConfig(config);
43 }
44
45 @Override
46 public String issue(final TokenSpec tokenSpec) {
47 final TokenClaims claims = Objects.requireNonNull(tokenSpec, "tokenSpec").claims();
48 final String encodedHeader = JwtCodec.encodeHeader(config.keyProvider().algorithm().headerValue());
49 final String encodedPayload = JwtCodec.encodeJson(ClaimsMapper.toPayload(claims));
50 final String signingInput = encodedHeader + "." + encodedPayload;
51 final String signature = JwtSigner.sign(signingInput, config);
52 return signingInput + "." + signature;
53 }
54
55 private static void validateIssuerConfig(final JwtConfig config) {
56 if (config.keyProvider().algorithm() == JwtAlgorithm.HS256 && config.keyProvider().hmacSecret() == null) {
57 throw new IllegalArgumentException("HS256 requires explicit hmac secret");
58 }
59 if (config.keyProvider().algorithm() == JwtAlgorithm.RS256 && config.keyProvider().privateKey() == null) {
60 throw new IllegalArgumentException("RS256 requires private key for issuing");
61 }
62 }
63}
String issue(final TokenSpec tokenSpec)
Configures JWT signing and verification behavior.
Normalized claims extracted from a JWT token.
Specification used by TokenIssuer to issue JWT tokens.
static ObjectNode toPayload(final TokenClaims claims)
static String encodeHeader(final String alg)
Definition JwtCodec.java:61
static String encodeJson(final JsonNode node)
Definition JwtCodec.java:57
static String sign(final String signingInput, final JwtConfig config)
Supported JWT signature algorithms.
API for issuing JWT tokens.