/*
* Copyright (c) 2015 Yann Le Moigne.
*
* 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 fr.javatic.ratpack.jwtauth;
import java.time.Instant;
import java.util.*;
/**
* JWT Claims according to https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1
*/
public class JWTClaims {
private Map<String, Object> claims;
public JWTClaims() {
claims = new HashMap<>();
claims.put("iat", System.currentTimeMillis());
claims.put("jti", UUID.randomUUID().toString());
}
public JWTClaims(Map<String, Object> verify) {
this.claims = new HashMap<>();
this.claims.putAll(verify);
}
public JWTClaims setIssuer(String issuer) {
claims.put("iss", issuer);
return this;
}
public JWTClaims setSubject(String subject) {
claims.put("sub", subject);
return this;
}
public JWTClaims setAudience(String... audiences) {
claims.put("aud", audiences);
return this;
}
public JWTClaims setExpirationTime(Instant instant) {
claims.put("exp", instant.toEpochMilli());
return this;
}
public JWTClaims setNotBefore(Instant instant) {
claims.put("nbf", instant.toEpochMilli());
return this;
}
public JWTClaims set(String string, Object value) {
claims.put("private." + string, value);
return this;
}
public String getIssuer() {
return (String) claims.get("iss");
}
public String getSubject() {
return (String) claims.get("sub");
}
public List<String> getAudience() {
return Arrays.asList((String[]) claims.get("aud"));
}
public Instant getExpirationTime() {
return Instant.ofEpochMilli((long) claims.get("exp"));
}
public Instant getNotBefore(Instant instant) {
return Instant.ofEpochMilli((long) claims.get("nbf"));
}
public <T> T get(String key) {
//noinspection unchecked
return (T) claims.get("private." + key);
}
public Map<String, Object> toMap() {
return Collections.unmodifiableMap(this.claims);
}
}