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
3import java.util.Objects;
4
5/*-
6 * #%L
7 * ether-jwt
8 * %%
9 * Copyright (C) 2025 - 2026 Raúl Eduardo González Argote
10 * %%
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 * #L%
29 */
30
31import dev.rafex.ether.jwt.internal.ClaimsMapper;
32import dev.rafex.ether.jwt.internal.JwtCodec;
33import dev.rafex.ether.jwt.internal.JwtSigner;
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.
Typed configuration entry points and composition APIs for Ether applications.