38public final class TokenClaims {
40 private final String subject;
41 private final String issuer;
42 private final List<String> audience;
43 private final Instant expiresAt;
44 private final Instant issuedAt;
45 private final Instant notBefore;
46 private final String jwtId;
47 private final List<String> roles;
49 private final String clientId;
50 private final Map<String, Object> extras;
52 private TokenClaims(
final Builder
builder) {
55 this.audience = immutableList(
builder.audience);
56 this.expiresAt =
builder.expiresAt;
57 this.issuedAt =
builder.issuedAt;
58 this.notBefore =
builder.notBefore;
60 this.roles = immutableList(
builder.roles);
61 this.tokenType =
builder.tokenType;
62 this.clientId =
builder.clientId;
63 this.extras = Collections.unmodifiableMap(
new LinkedHashMap<>(
builder.extras));
119 .expiresAt(expiresAt)
121 .notBefore(notBefore)
124 .tokenType(tokenType)
129 private static List<String> immutableList(
final List<String> input) {
130 if (input ==
null || input.isEmpty()) {
133 final List<String> values =
new ArrayList<>();
134 for (
final String value : input) {
135 if (value !=
null && !value.isBlank()) {
139 return Collections.unmodifiableList(values);
142 public static final class Builder {
145 private List<String>
audience =
new ArrayList<>();
149 private String
jwtId;
150 private List<String>
roles =
new ArrayList<>();
153 private Map<String, Object>
extras =
new LinkedHashMap<>();
158 public Builder
subject(
final String subject) {
159 this.subject = blankToNull(subject);
163 public Builder
issuer(
final String issuer) {
164 this.issuer = blankToNull(issuer);
168 public Builder
audience(
final List<String> audience) {
169 this.audience = audience ==
null ?
new ArrayList<>() : new ArrayList<>(audience);
173 public Builder
audience(
final String... audience) {
174 final List<String> values =
new ArrayList<>();
175 if (audience !=
null) {
176 Collections.addAll(values, audience);
178 this.audience = values;
182 public Builder
expiresAt(
final Instant expiresAt) {
183 this.expiresAt = expiresAt;
187 public Builder
issuedAt(
final Instant issuedAt) {
188 this.issuedAt = issuedAt;
192 public Builder
notBefore(
final Instant notBefore) {
193 this.notBefore = notBefore;
197 public Builder
jwtId(
final String jwtId) {
198 this.jwtId = blankToNull(jwtId);
202 public Builder
roles(
final List<String> roles) {
203 this.roles = roles ==
null ?
new ArrayList<>() : new ArrayList<>(roles);
207 public Builder
roles(
final String... roles) {
208 final List<String> values =
new ArrayList<>();
210 Collections.addAll(values, roles);
216 public Builder
tokenType(
final TokenType tokenType) {
217 this.tokenType = tokenType;
221 public Builder
clientId(
final String clientId) {
222 this.clientId = blankToNull(clientId);
226 public Builder
extras(
final Map<String, Object> extras) {
227 this.extras = extras ==
null ?
new LinkedHashMap<>() : new LinkedHashMap<>(extras);
231 public Builder extra(
final String key,
final Object value) {
232 if (key ==
null || key.isBlank()) {
233 throw new IllegalArgumentException(
"extra claim key is required");
235 extras.put(key, value);
239 public TokenClaims build() {
240 return new TokenClaims(
this);
243 private static String blankToNull(
final String value) {
244 return value ==
null || value.isBlank() ? null : value;