package com.twilio.jwt.accesstoken;
import com.twilio.jwt.Jwt;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Access Token use to grant privileges to Twilio resources.
*
* <p>For more information see:
* <a href="https://www.twilio.com/docs/api/rest/access-tokens">
* https://www.twilio.com/docs/api/rest/access-tokens
* </a>
* </p>
*/
public class AccessToken extends Jwt {
private static final String CTY = "twilio-fpa;v=1";
private final String id;
private final String accountSid;
private final String identity;
private final Date nbf;
private final Set<Grant> grants;
private AccessToken(Builder b) {
super(
SignatureAlgorithm.HS256,
b.secret,
b.keySid,
new Date(new Date().getTime() + b.ttl * 1000)
);
Date now = new Date();
this.id = b.keySid + "-" + (int)(Math.floor(now.getTime() / 1000.0f));
this.accountSid = b.accountSid;
this.identity = b.identity;
this.nbf = b.nbf;
this.grants = Collections.unmodifiableSet(b.grants);
}
@Override
public Date getNbf() {
return this.nbf;
}
@Override
public String getId() {
return this.id;
}
@Override
public String getSubject() {
return this.accountSid;
}
@Override
public Map<String, Object> getHeaders() {
Map<String, Object> headers = new HashMap<>();
headers.put("cty", CTY);
return headers;
}
@Override
public Map<String, Object> getClaims() {
Map<String, Object> grants = new HashMap<>();
if (this.identity != null) {
grants.put("identity", this.identity);
}
for (Grant grant : this.grants) {
grants.put(grant.getGrantKey(), grant.getPayload());
}
Map<String, Object> payload = new HashMap<>();
payload.put("grants", grants);
return payload;
}
/** Builder used to construct a Access Token. */
public static class Builder {
private String accountSid;
private String keySid;
private String secret;
private String identity;
private Date nbf = null;
private int ttl = 3600;
private Set<Grant> grants = new HashSet<Grant>();
/**
* Create a new builder for a Access Token.
*
* @param accountSid account to use
* @param keySid key to use
* @param secret secret key
*/
public Builder(String accountSid, String keySid, String secret) {
this.accountSid = accountSid;
this.keySid = keySid;
this.secret = secret;
}
public Builder identity(String identity) {
this.identity = identity;
return this;
}
public Builder ttl(int ttl) {
this.ttl = ttl;
return this;
}
public Builder nbf(Date nbf) {
this.nbf = nbf;
return this;
}
public Builder grant(Grant grant) {
this.grants.add(grant);
return this;
}
public Builder grants(Collection<Grant> grants) {
this.grants.addAll(grants);
return this;
}
public AccessToken build() {
return new AccessToken(this);
}
}
}