Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* nimbus-jose-jwt
*
* Copyright 2012-2016, Connect2id Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the
* License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.nimbusds.jwt;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.util.JSONArrayUtils;
import com.nimbusds.jose.util.JSONObjectUtils;
import com.nimbusds.jwt.util.DateUtils;
import net.jcip.annotations.Immutable;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.*;
/**
* JSON Web Token (JWT) claims set. This class is immutable.
*
*
Supports all {@link #getRegisteredNames() registered claims} of the JWT
* specification:
*
*
*
iss - Issuer
*
sub - Subject
*
aud - Audience
*
exp - Expiration Time
*
nbf - Not Before
*
iat - Issued At
*
jti - JWT ID
*
*
*
The set may also contain custom claims.
*
*
Claims with {@code null} values will not be serialised with
* {@link #toPayload()} / {@link #toJSONObject()} / {@link #toString()} unless
* {@link Builder#serializeNullClaims} is enabled.
*
*
*
* @author Vladimir Dzhuvinov
* @author Justin Richer
* @version 2024-06-06
*/
@Immutable
public final class JWTClaimsSet implements Serializable {
private static final long serialVersionUID = 1L;
/**
* The registered claim names.
*/
private static final Set REGISTERED_CLAIM_NAMES;
/*
* Initialises the registered claim name set.
*/
static {
Set n = new HashSet<>();
n.add(JWTClaimNames.ISSUER);
n.add(JWTClaimNames.SUBJECT);
n.add(JWTClaimNames.AUDIENCE);
n.add(JWTClaimNames.EXPIRATION_TIME);
n.add(JWTClaimNames.NOT_BEFORE);
n.add(JWTClaimNames.ISSUED_AT);
n.add(JWTClaimNames.JWT_ID);
REGISTERED_CLAIM_NAMES = Collections.unmodifiableSet(n);
}
/**
* Builder for constructing JSON Web Token (JWT) claims sets.
*
*
*/
public static class Builder {
/**
* The claims.
*/
private final Map claims = new LinkedHashMap<>();
/**
* Controls serialisation of claims with {@code null} values.
*/
private boolean serializeNullClaims = false;
/**
* Creates a new builder.
*/
public Builder() {
// Nothing to do
}
/**
* Creates a new builder with the claims from the specified
* set.
*
* @param jwtClaimsSet The JWT claims set to use. Must not be
* {@code null}.
*/
public Builder(final JWTClaimsSet jwtClaimsSet) {
claims.putAll(jwtClaimsSet.claims);
}
/**
* Controls the serialisation of claims with {@code null}
* values when {@link #toPayload()} / {@link #toJSONObject()} /
* {@link #toString()} is called. Disabled by default.
*
* @param enable {@code true} to serialise claims with
* {@code null} values, {@code false} to omit
* them.
*
* @return This builder.
*/
public Builder serializeNullClaims(final boolean enable) {
serializeNullClaims = enable;
return this;
}
/**
* Sets the issuer ({@code iss}) claim.
*
* @param iss The issuer claim, {@code null} if not specified.
*
* @return This builder.
*/
public Builder issuer(final String iss) {
claims.put(JWTClaimNames.ISSUER, iss);
return this;
}
/**
* Sets the subject ({@code sub}) claim.
*
* @param sub The subject claim, {@code null} if not specified.
*
* @return This builder.
*/
public Builder subject(final String sub) {
claims.put(JWTClaimNames.SUBJECT, sub);
return this;
}
/**
* Sets the audience ({@code aud}) claim.
*
* @param aud The audience claim, {@code null} if not
* specified.
*
* @return This builder.
*/
public Builder audience(final List aud) {
claims.put(JWTClaimNames.AUDIENCE, aud);
return this;
}
/**
* Sets a single-valued audience ({@code aud}) claim.
*
* @param aud The audience claim, {@code null} if not
* specified.
*
* @return This builder.
*/
public Builder audience(final String aud) {
if (aud == null) {
claims.put(JWTClaimNames.AUDIENCE, null);
} else {
claims.put(JWTClaimNames.AUDIENCE, Collections.singletonList(aud));
}
return this;
}
/**
* Sets the expiration time ({@code exp}) claim.
*
* @param exp The expiration time, {@code null} if not
* specified.
*
* @return This builder.
*/
public Builder expirationTime(final Date exp) {
claims.put(JWTClaimNames.EXPIRATION_TIME, exp);
return this;
}
/**
* Sets the not-before ({@code nbf}) claim.
*
* @param nbf The not-before claim, {@code null} if not
* specified.
*
* @return This builder.
*/
public Builder notBeforeTime(final Date nbf) {
claims.put(JWTClaimNames.NOT_BEFORE, nbf);
return this;
}
/**
* Sets the issued-at ({@code iat}) claim.
*
* @param iat The issued-at claim, {@code null} if not
* specified.
*
* @return This builder.
*/
public Builder issueTime(final Date iat) {
claims.put(JWTClaimNames.ISSUED_AT, iat);
return this;
}
/**
* Sets the JWT ID ({@code jti}) claim.
*
* @param jti The JWT ID claim, {@code null} if not specified.
*
* @return This builder.
*/
public Builder jwtID(final String jti) {
claims.put(JWTClaimNames.JWT_ID, jti);
return this;
}
/**
* Sets the specified claim (registered or custom).
*
* @param name The name of the claim to set. Must not be
* {@code null}.
* @param value The value of the claim to set, {@code null} if
* not specified. Should map to a JSON entity.
*
* @return This builder.
*/
public Builder claim(final String name, final Object value) {
claims.put(name, value);
return this;
}
/**
* Gets the claims (registered and custom).
*
*
Note that the registered claims Expiration-Time
* ({@code exp}), Not-Before-Time ({@code nbf}) and Issued-At
* ({@code iat}) will be returned as {@code java.util.Date}
* instances.
*
* @return The claims, as an unmodifiable map, empty map if
* none.
*/
public Map getClaims() {
return Collections.unmodifiableMap(claims);
}
/**
* Builds a new JWT claims set.
*
* @return The JWT claims set.
*/
public JWTClaimsSet build() {
return new JWTClaimsSet(claims, serializeNullClaims);
}
}
/**
* The claims map.
*/
private final Map claims = new LinkedHashMap<>();
/**
* Controls serialisation of claims with {@code null} values.
*/
private final boolean serializeNullClaims;
/**
* Creates a new JWT claims set.
*
* @param claims The JWT claims set as a map. Must not be {@code null}.
*/
private JWTClaimsSet(final Map claims,
final boolean serializeNullClaims) {
this.claims.putAll(claims);
this.serializeNullClaims = serializeNullClaims;
}
/**
* Gets the registered JWT claim names.
*
* @return The registered claim names, as an unmodifiable set.
*/
public static Set getRegisteredNames() {
return REGISTERED_CLAIM_NAMES;
}
/**
* Gets the issuer ({@code iss}) claim.
*
* @return The issuer claim, {@code null} if not specified.
*/
public String getIssuer() {
try {
return getStringClaim(JWTClaimNames.ISSUER);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the subject ({@code sub}) claim.
*
* @return The subject claim, {@code null} if not specified.
*/
public String getSubject() {
try {
return getStringClaim(JWTClaimNames.SUBJECT);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the audience ({@code aud}) claim.
*
* @return The audience claim, empty list if not specified.
*/
public List getAudience() {
Object audValue = getClaim(JWTClaimNames.AUDIENCE);
if (audValue instanceof String) {
// Special case
return Collections.singletonList((String)audValue);
}
List aud;
try {
aud = getStringListClaim(JWTClaimNames.AUDIENCE);
} catch (ParseException e) {
return Collections.emptyList();
}
return aud != null ? aud : Collections.emptyList();
}
/**
* Gets the expiration time ({@code exp}) claim.
*
* @return The expiration time, {@code null} if not specified.
*/
public Date getExpirationTime() {
try {
return getDateClaim(JWTClaimNames.EXPIRATION_TIME);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the not-before ({@code nbf}) claim.
*
* @return The not-before claim, {@code null} if not specified.
*/
public Date getNotBeforeTime() {
try {
return getDateClaim(JWTClaimNames.NOT_BEFORE);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the issued-at ({@code iat}) claim.
*
* @return The issued-at claim, {@code null} if not specified.
*/
public Date getIssueTime() {
try {
return getDateClaim(JWTClaimNames.ISSUED_AT);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the JWT ID ({@code jti}) claim.
*
* @return The JWT ID claim, {@code null} if not specified.
*/
public String getJWTID() {
try {
return getStringClaim(JWTClaimNames.JWT_ID);
} catch (ParseException e) {
return null;
}
}
/**
* Gets the specified claim (registered or custom).
*
* @param name The name of the claim. Must not be {@code null}.
*
* @return The value of the claim, {@code null} if not specified.
*/
public Object getClaim(final String name) {
return claims.get(name);
}
/**
* Gets the specified claim (registered or custom) as
* {@link java.lang.String}.
*
* @param name The name of the claim. Must not be {@code null}.
*
* @return The value of the claim, {@code null} if not specified.
*
* @throws ParseException If the claim value is not of the required
* type.
*/
public String getStringClaim(final String name)
throws ParseException {
Object value = getClaim(name);
if (value == null || value instanceof String) {
return (String)value;
} else {
throw new ParseException("The " + name + " claim is not a String", 0);
}
}
/**
* Gets the specified claims (registered or custom) as a
* {@link java.util.List} list of objects.
*
* @param name The name of the claim. Must not be {@code null}.
*
* @return The value of the claim, {@code null} if not specified.
*
* @throws ParseException If the claim value is not of the required
* type.
*/
public List