Skip to content

Commit

Permalink
fix: Do not include null values in JWT payloads (twilio#516)
Browse files Browse the repository at this point in the history
  • Loading branch information
thinkingserious authored and FalguniV committed Oct 13, 2020
1 parent 36fa795 commit 7312b17
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 56 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/twilio/jwt/accesstoken/ChatGrant.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;
/**
* Grant used to access Twilio Chat.
*
Expand Down Expand Up @@ -63,6 +64,7 @@ public Object getPayload() {
}

@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String service_sid;
public final String deployment_role_sid;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;

/**
* Grant used to access Twilio Conversations.
*
Expand Down Expand Up @@ -35,6 +37,7 @@ public Object getPayload() {


@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String configuration_profile_sid;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;

/**
* Grant used to access Twilio IP Messaging.
*
Expand Down Expand Up @@ -64,6 +66,7 @@ public Object getPayload() {
}

@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String service_sid;
public final String deployment_role_sid;
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/twilio/jwt/accesstoken/SyncGrant.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;

/**
* Grant used to access Twilio Sync.
*
Expand Down Expand Up @@ -44,6 +46,7 @@ public Object getPayload() {
}

@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String service_sid;
public final String endpoint_id;
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/twilio/jwt/accesstoken/TaskRouterGrant.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;

/**
* Grant used to access Twilio TaskRouter.
*
Expand Down Expand Up @@ -54,6 +56,7 @@ public Object getPayload() {
}

@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String workspace_sid;
public final String worker_sid;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/twilio/jwt/accesstoken/VideoGrant.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public Object getPayload() {


@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public final String configuration_profile_sid;
public final String room;
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/twilio/jwt/accesstoken/VoiceGrant.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.twilio.jwt.accesstoken;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.google.common.base.Strings;

import java.util.HashMap;
Expand Down Expand Up @@ -70,6 +71,7 @@ public Object getPayload() {
}

@SuppressWarnings("checkstyle:membername")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Payload {
public Map<String, Object> incoming;
public Map<String, Object> outgoing;
Expand Down
92 changes: 37 additions & 55 deletions src/test/java/com/twilio/jwt/accesstoken/AccessTokenTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ private void validateToken(Claims claims) {
Assert.assertTrue(claims.getExpiration().getTime() > new Date().getTime());
}

private Claims getClaimFromJwtToken(Jwt token) {
return Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
}

private void testVoiceToken(Boolean allow) {
Map<String, Object> params = new HashMap<>();
params.put("foo", "bar");
Expand All @@ -44,11 +51,7 @@ private void testVoiceToken(Boolean allow) {
.grant(pvg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);
Map<String, Object> decodedGrants = (Map<String, Object>) claims.get("grants");
Expand All @@ -71,11 +74,7 @@ public void testEmptyToken() {
new AccessToken.Builder(ACCOUNT_SID, SIGNING_KEY_SID, SECRET)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);
}
Expand All @@ -88,11 +87,7 @@ public void testOptionalValues() {
.nbf(new Date())
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);
Assert.assertTrue(claims.getNotBefore().getTime() <= new Date().getTime());
Expand All @@ -106,11 +101,7 @@ public void testConversationGrant() {
.grant(cg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand All @@ -129,11 +120,7 @@ public void testVideoGrant() {
.grant(cg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand All @@ -156,11 +143,7 @@ public void testIpMessagingGrant() {
.grant(ipg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand All @@ -186,11 +169,7 @@ public void testChatGrant() {
.grant(cg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand All @@ -214,11 +193,7 @@ public void testSyncGrant() {
.grant(sg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand All @@ -242,11 +217,7 @@ public void testTaskRouterGrant() {
.grant(trg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Expand Down Expand Up @@ -276,11 +247,7 @@ public void testCompleteToken() {
.nbf(new Date())
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);
Assert.assertTrue(claims.getNotBefore().getTime() <= new Date().getTime());
Expand Down Expand Up @@ -317,11 +284,7 @@ public void testVoiceTokenWithoutIncoming() {
.grant(pvg)
.build();

Claims claims =
Jwts.parser()
.setSigningKey(SECRET.getBytes())
.parseClaimsJws(token.toJwt())
.getBody();
Claims claims = getClaimFromJwtToken(token);

validateToken(claims);
Map<String, Object> decodedGrants = (Map<String, Object>) claims.get("grants");
Expand All @@ -336,4 +299,23 @@ public void testVoiceTokenWithoutIncoming() {
Assert.assertEquals("AP123", outgoing.get("application_sid"));
Assert.assertEquals("bar", outgoingParams.get("foo"));
}

@Test()
public void testNullValues() {
ChatGrant cg = new ChatGrant().setDeploymentRoleSid("RL123");
Jwt token =
new AccessToken.Builder(ACCOUNT_SID, SIGNING_KEY_SID, SECRET)
.grant(cg)
.build();

Claims claims = getClaimFromJwtToken(token);

validateToken(claims);

Map<String, Object> decodedGrants = (Map<String, Object>) claims.get("grants");
Map<String, Object> grant = (Map<String, Object>) decodedGrants.get("chat");

Assert.assertEquals("RL123", grant.get("deployment_role_sid"));
Assert.assertFalse(grant.containsKey("endpoint_id"));
}
}

0 comments on commit 7312b17

Please sign in to comment.