37public final class TokenClaims {
39 private final String subject;
40 private final String issuer;
41 private final List<String> audience;
42 private final Instant expiresAt;
43 private final Instant issuedAt;
44 private final Instant notBefore;
45 private final String jwtId;
46 private final List<String> roles;
48 private final String clientId;
49 private final Map<String, Object> extras;
51 private TokenClaims(
final Builder
builder) {
54 this.audience = immutableList(
builder.audience);
55 this.expiresAt =
builder.expiresAt;
56 this.issuedAt =
builder.issuedAt;
57 this.notBefore =
builder.notBefore;
59 this.roles = immutableList(
builder.roles);
60 this.tokenType =
builder.tokenType;
61 this.clientId =
builder.clientId;
62 this.extras = Collections.unmodifiableMap(
new LinkedHashMap<>(
builder.extras));
114 return builder().subject(subject).issuer(issuer).audience(audience).expiresAt(expiresAt).issuedAt(issuedAt)
115 .notBefore(notBefore).jwtId(jwtId).roles(roles).tokenType(tokenType).clientId(clientId).extras(extras);
118 private static List<String> immutableList(
final List<String> input) {
119 if (input ==
null || input.isEmpty()) {
122 final List<String> values =
new ArrayList<>();
123 for (
final String value : input) {
124 if (value !=
null && !value.isBlank()) {
128 return Collections.unmodifiableList(values);
131 public static final class Builder {
134 private List<String>
audience =
new ArrayList<>();
138 private String
jwtId;
139 private List<String>
roles =
new ArrayList<>();
142 private Map<String, Object>
extras =
new LinkedHashMap<>();
147 public Builder
subject(
final String subject) {
148 this.subject = blankToNull(subject);
152 public Builder
issuer(
final String issuer) {
153 this.issuer = blankToNull(issuer);
157 public Builder
audience(
final List<String> audience) {
158 this.audience = audience ==
null ?
new ArrayList<>() : new ArrayList<>(audience);
162 public Builder
audience(
final String... audience) {
163 final List<String> values =
new ArrayList<>();
164 if (audience !=
null) {
165 Collections.addAll(values, audience);
167 this.audience = values;
171 public Builder
expiresAt(
final Instant expiresAt) {
172 this.expiresAt = expiresAt;
176 public Builder
issuedAt(
final Instant issuedAt) {
177 this.issuedAt = issuedAt;
181 public Builder
notBefore(
final Instant notBefore) {
182 this.notBefore = notBefore;
186 public Builder
jwtId(
final String jwtId) {
187 this.jwtId = blankToNull(jwtId);
191 public Builder
roles(
final List<String> roles) {
192 this.roles = roles ==
null ?
new ArrayList<>() : new ArrayList<>(roles);
196 public Builder
roles(
final String... roles) {
197 final List<String> values =
new ArrayList<>();
199 Collections.addAll(values, roles);
205 public Builder
tokenType(
final TokenType tokenType) {
206 this.tokenType = tokenType;
210 public Builder
clientId(
final String clientId) {
211 this.clientId = blankToNull(clientId);
215 public Builder
extras(
final Map<String, Object> extras) {
216 this.extras = extras ==
null ?
new LinkedHashMap<>() : new LinkedHashMap<>(extras);
220 public Builder extra(
final String key,
final Object value) {
221 if (key ==
null || key.isBlank()) {
222 throw new IllegalArgumentException(
"extra claim key is required");
224 extras.put(key, value);
228 public TokenClaims build() {
229 return new TokenClaims(
this);
232 private static String blankToNull(
final String value) {
233 return value ==
null || value.isBlank() ? null : value;