1 /*
2 * The contents of this file are subject to the terms of the Common Development and
3 * Distribution License (the License). You may not use this file except in compliance with the
4 * License.
5 *
6 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
7 * specific language governing permission and limitations under the License.
8 *
9 * When distributing Covered Software, include this CDDL Header Notice in each file and include
10 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
11 * Header, with the fields enclosed by brackets [] replaced by your own identifying
12 * information: "Portions copyright [year] [name of copyright owner]".
13 *
14 * Copyright 2013-2016 ForgeRock AS.
15 */
16
17 package org.forgerock.json.jose.jwt;
18
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.Locale;
22 import java.util.Map;
23
24 /**
25 * An Enum for the JWT Claims Set names.
26 * <p>
27 * As described in the JWT specification, this Enum class represents all the reserved JWT Claim Names, any other Claim
28 * name is deemed as a "custom" Claim name.
29 * <p>
30 * @see <a href="http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.1">Reserved Claim Names</a>
31 *
32 * @since 2.0.0
33 */
34 public enum JwtClaimsSetKey {
35
36 /**
37 * Type Claim.
38 * <p>
39 * Used to declare a type for the contents of this JWT Claims Set.
40 * <p>
41 * The values used for the "typ" claim SHOULD come from the same value space as the "typ" header parameter, with
42 * the same rules applying.
43 */
44 TYP,
45 /**
46 * JWT ID Claim.
47 * <p>
48 * Provides a unique identifier for the JWT.
49 */
50 JTI,
51 /**
52 * Issuer Claim.
53 * <p>
54 * Identifies the principal that issued the JWT.
55 */
56 ISS,
57 /**
58 * Subject Claim.
59 * <p>
60 * Identifies the subject of the JWT.
61 */
62 SUB,
63 /**
64 * Audience Claim.
65 * <p>
66 * Identifies the audience that the JWT is intended for.
67 */
68 AUD,
69 /**
70 * Issued At Claim.
71 * <p>
72 * Identifies the time at which the JWT was issued. This claim can be used to determine the age of the token.
73 */
74 IAT,
75 /**
76 * Not Before Claim.
77 * <p>
78 * Identifies the time before which the token MUST NOT be accepted for processing.
79 */
80 NBF,
81 /**
82 * Expiration Time Claim.
83 * <p>
84 * Identifies the expiration time on or after which the token MUST NOT be accepted for processing.
85 */
86 EXP,
87 /**
88 * Custom (private) Claim.
89 * <p>
90 * Represents any claim not registered in the JWT spec.
91 */
92 CUSTOM;
93
94 /**
95 * Read-only {@code Map} of {@code JwtClaimsSetKey} values as lower-case {@code String}s, for fast lookup.
96 */
97 private static final Map<String, JwtClaimsSetKey> NAME_MAP;
98
99 static {
100 final Map<String, JwtClaimsSetKey> temp = new HashMap<>();
101 for (final JwtClaimsSetKey key : values()) {
102 temp.put(key.lowerCaseName, key);
103 }
104 NAME_MAP = Collections.unmodifiableMap(temp);
105 }
106
107 private final String lowerCaseName;
108
109 /**
110 * Creates a {@code JwtClaimsSetKey} with pre-allocated lower-case {@code String} representation, as a
111 * performance optimization, because this {@code enum} is often converted to a {@code String}.
112 */
113 JwtClaimsSetKey() {
114 this.lowerCaseName = name().toLowerCase(Locale.ROOT);
115 }
116
117 /**
118 * Returns a lowercase String of the {@code JwtClaimsSetKey} constant.
119 *
120 * @return Lowercase String representation of the constant.
121 * @see #toString()
122 */
123 public String value() {
124 return toString();
125 }
126
127 /**
128 * Gets the {@code JwtClaimsSetKey} constant that matches the given {@code String} (case-insensitive).
129 *
130 * @param claimSetKey The case-insensitive {@code String} representation of a {@code JwtClaimsSetKey}.
131 * @return The matching {@code JwtClaimsSetKey} or {@link #CUSTOM} for keys not in the JWT spec.
132 */
133 public static JwtClaimsSetKey getClaimSetKey(final String claimSetKey) {
134 if (claimSetKey != null && !claimSetKey.isEmpty()) {
135 final JwtClaimsSetKey value = NAME_MAP.get(claimSetKey.toLowerCase(Locale.ROOT));
136 if (value != null) {
137 return value;
138 }
139 }
140 return CUSTOM;
141 }
142
143 /**
144 * Turns the {@code JwtClaimsSetKey} constant into a lowercase {@code String}.
145 *
146 * @return {@inheritDoc}
147 */
148 @Override
149 public String toString() {
150 return lowerCaseName;
151 }
152 }