1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.json.jose.jwt;
18
19 import static java.util.Collections.*;
20 import static org.forgerock.json.jose.jwt.JwtClaimsSetKey.*;
21
22 import java.net.URI;
23 import java.util.ArrayList;
24 import java.util.Date;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.forgerock.json.JsonValue;
29 import org.forgerock.json.jose.utils.IntDate;
30 import org.forgerock.json.jose.utils.StringOrURI;
31
32
33
34
35
36
37
38
39 public class JwtClaimsSet extends JWObject implements Payload {
40
41
42
43
44 public JwtClaimsSet() {
45 }
46
47
48
49
50
51
52 public JwtClaimsSet(Map<String, Object> claims) {
53 setClaims(claims);
54 }
55
56
57
58
59
60
61
62
63
64 public void setType(String type) {
65 put(TYP.value(), type);
66 }
67
68
69
70
71
72
73
74
75
76 public String getType() {
77 return get(TYP.value()).asString();
78 }
79
80
81
82
83
84
85 public void setJwtId(String jwtId) {
86 put(JTI.value(), jwtId);
87 }
88
89
90
91
92
93
94 public String getJwtId() {
95 return get(JTI.value()).asString();
96 }
97
98
99
100
101
102
103
104
105
106 public void setIssuer(String issuer) {
107 StringOrURI.validateStringOrURI(issuer);
108 put(ISS.value(), issuer);
109 }
110
111
112
113
114
115
116 public void setIssuer(URI issuer) {
117 put(ISS.value(), issuer.toString());
118 }
119
120
121
122
123
124
125
126 public String getIssuer() {
127 return get(ISS.value()).asString();
128 }
129
130
131
132
133
134
135
136
137
138
139 public void setSubject(String subject) {
140 StringOrURI.validateStringOrURI(subject);
141 put(SUB.value(), subject);
142 }
143
144
145
146
147
148
149
150 public void setSubject(URI subject) {
151 put(SUB.value(), subject.toString());
152 }
153
154
155
156
157
158
159 public String getSubject() {
160 return get(SUB.value()).asString();
161 }
162
163
164
165
166
167
168
169
170
171
172 public void addAudience(String audience) {
173 StringOrURI.validateStringOrURI(audience);
174 addAudienceWithTypeCheck(audience);
175 }
176
177
178
179
180
181
182
183 public void addAudience(URI audience) {
184 addAudienceWithTypeCheck(audience.toString());
185 }
186
187 private void addAudienceWithTypeCheck(String audience) {
188 JsonValue audienceClaim = get(AUD.value());
189
190 if (audienceClaim.isNull()) {
191 put(AUD.value(), audience);
192 } else if (audienceClaim.isList()) {
193 audienceClaim.asList().add(audience);
194 } else {
195 List<String> audienceList = new ArrayList<>();
196 audienceList.add(audienceClaim.asString());
197 audienceList.add(audience);
198 put(AUD.value(), audienceList);
199 }
200 }
201
202
203
204
205
206
207 public List<String> getAudience() {
208 JsonValue audience = get(AUD.value());
209 if (audience.isNull()) {
210 return null;
211 } else if (audience.isList()) {
212 return audience.asList(String.class);
213 } else {
214 return singletonList(audience.asString());
215 }
216 }
217
218
219
220
221
222
223
224
225 public void setIssuedAtTime(Date issuedAtTime) {
226 put(IAT.value(), IntDate.toIntDate(issuedAtTime));
227 }
228
229
230
231
232
233
234
235
236
237 private void setIssuedAtTime(long issuedAtTime) {
238 put(IAT.value(), issuedAtTime);
239 }
240
241
242
243
244
245
246 public Date getIssuedAtTime() {
247 return getDate(IAT.value());
248 }
249
250
251
252
253
254
255
256
257 public void setNotBeforeTime(Date notBeforeTime) {
258 put(NBF.value(), IntDate.toIntDate(notBeforeTime));
259 }
260
261
262
263
264
265
266
267
268
269 private void setNotBeforeTime(long notBeforeTime) {
270 put(NBF.value(), notBeforeTime);
271 }
272
273
274
275
276
277
278 public Date getNotBeforeTime() {
279 return getDate(NBF.value());
280 }
281
282
283
284
285
286
287
288
289 public void setExpirationTime(Date expirationTime) {
290 put(EXP.value(), IntDate.toIntDate(expirationTime));
291 }
292
293
294
295
296
297
298
299
300
301 private void setExpirationTime(long expirationTime) {
302 put(EXP.value(), expirationTime);
303 }
304
305
306
307
308
309
310 public Date getExpirationTime() {
311 return getDate(EXP.value());
312 }
313
314
315
316
317
318
319
320
321
322
323 public void setClaim(String key, Object value) {
324
325 JwtClaimsSetKey claimsSetKey = getClaimSetKey(key.toUpperCase());
326
327 switch (claimsSetKey) {
328 case TYP: {
329 checkValueIsOfType(value, String.class);
330 setType((String) value);
331 break;
332 }
333 case JTI: {
334 checkValueIsOfType(value, String.class);
335 setJwtId((String) value);
336 break;
337 }
338 case ISS: {
339 if (isValueOfType(value, URI.class)) {
340 setIssuer((URI) value);
341 } else {
342 checkValueIsOfType(value, String.class);
343 setIssuer((String) value);
344 }
345 break;
346 }
347 case SUB: {
348 if (isValueOfType(value, URI.class)) {
349 setSubject((URI) value);
350 } else {
351 checkValueIsOfType(value, String.class);
352 setSubject((String) value);
353 }
354 break;
355 }
356 case AUD: {
357 if (isValueOfType(value, List.class)) {
358 List<?> audienceList = (List<?>) value;
359 for (Object audience : audienceList) {
360 if (isValueOfType(audience, URI.class)) {
361 addAudience((URI) audience);
362 } else {
363 checkValueIsOfType(audience, String.class);
364 addAudience((String) audience);
365 }
366 }
367 } else {
368 if (isValueOfType(value, URI.class)) {
369 addAudience((URI) value);
370 } else {
371 checkValueIsOfType(value, String.class);
372 addAudience((String) value);
373 }
374 }
375 break;
376 }
377 case IAT: {
378 if (isValueOfType(value, Number.class)) {
379 setIssuedAtTime(((Number) value).longValue());
380 } else {
381 checkValueIsOfType(value, Date.class);
382 setIssuedAtTime((Date) value);
383 }
384 break;
385 }
386 case NBF: {
387 if (isValueOfType(value, Number.class)) {
388 setNotBeforeTime(((Number) value).longValue());
389 } else {
390 checkValueIsOfType(value, Date.class);
391 setNotBeforeTime((Date) value);
392 }
393 break;
394 }
395 case EXP: {
396 if (isValueOfType(value, Number.class)) {
397 setExpirationTime(((Number) value).longValue());
398 } else {
399 checkValueIsOfType(value, Date.class);
400 setExpirationTime((Date) value);
401 }
402 break;
403 }
404 default: {
405 put(key, value);
406 }
407 }
408 }
409
410
411
412
413
414
415 public void setClaims(Map<String, Object> claims) {
416 for (String key : claims.keySet()) {
417 setClaim(key, claims.get(key));
418 }
419 }
420
421
422
423
424
425
426
427
428
429
430 public Object getClaim(String key) {
431
432 JwtClaimsSetKey claimsSetKey = getClaimSetKey(key.toUpperCase());
433
434 Object value;
435
436 switch (claimsSetKey) {
437 case TYP: {
438 value = getType();
439 break;
440 }
441 case JTI: {
442 value = getJwtId();
443 break;
444 }
445 case ISS: {
446 value = getIssuer();
447 break;
448 }
449 case SUB: {
450 value = getSubject();
451 break;
452 }
453 case AUD: {
454 value = getAudience();
455 break;
456 }
457 case IAT: {
458 value = getIssuedAtTime();
459 break;
460 }
461 case NBF: {
462 value = getNotBeforeTime();
463 break;
464 }
465 case EXP: {
466 value = getExpirationTime();
467 break;
468 }
469 default: {
470 value = get(key).getObject();
471 }
472 }
473
474 return value;
475 }
476
477
478
479
480
481
482
483
484
485
486 public <T> T getClaim(String key, Class<T> clazz) {
487 return clazz.cast(getClaim(key));
488 }
489
490
491
492
493
494
495 public String build() {
496 return toString();
497 }
498
499
500
501
502
503
504
505
506 private Date getDate(final String key) {
507 final JsonValue value = get(key);
508 return value.isNull() ? null : IntDate.fromIntDate(value.asLong());
509 }
510 }