/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.picketlink.test.json.api;
import org.junit.Test;
import org.picketlink.json.jwt.JWT;
import org.picketlink.json.jwt.JWTBuilder;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonString;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* The Class JWTAPITestCase.
*
* @author Pedro Igor
*/
public class JWTAPITestCase {
/**
* Test standard build.
*/
@Test
public void testStandardBuild() {
JWT token = new JWTBuilder()
.id("1")
.issuer("issuer")
.subject("subject")
.audience("audience")
.expiration(123)
.issuedAt(456)
.notBefore(789)
.build();
String jsonString = token.toString();
assertEquals("{\"typ\":\"JWT\"}.{\"jti\":\"1\",\"iss\":\"issuer\",\"sub\":\"subject\",\"aud\":\"audience\",\"exp\":123,\"iat\":456,\"nbf\":789}", jsonString);
String jsonEncoded = token.encode();
JWT parsedToken = new JWTBuilder().build(jsonEncoded);
assertEquals("1", parsedToken.getId());
assertEquals("issuer", parsedToken.getIssuer());
assertEquals("subject", parsedToken.getSubject());
assertArrayEquals(new String[] {"audience"}, parsedToken.getAudience().toArray());
assertEquals(Integer.valueOf(123), parsedToken.getExpiration());
assertEquals(Integer.valueOf(456), parsedToken.getIssuedAt());
assertEquals(Integer.valueOf(789), parsedToken.getNotBefore());
}
/**
* Test custom web token build.
*/
@Test
public void testCustomWebTokenBuild() {
MyWebToken token = new MyWebToken.MyWebTokenBuilder()
.roles("maintainer", "profile") // here we define a custom claim
.id("1")
.issuer("issuer")
.subject("subject")
.audience("audience")
.expiration(123)
.issuedAt(456)
.notBefore(789)
.build();
String jsonString = token.toString();
assertEquals("{\"typ\":\"JWT\"}.{\"roles\":[\"maintainer\",\"profile\"],\"jti\":\"1\",\"iss\":\"issuer\",\"sub\":\"subject\",\"aud\":\"audience\",\"exp\":123,\"iat\":456,\"nbf\":789}", jsonString);
String jsonEncoded = token.encode();
MyWebToken parsedToken = new MyWebToken.MyWebTokenBuilder().build(jsonEncoded);
assertNotNull(parsedToken);
assertArrayEquals(new String[] {"maintainer", "profile"}, parsedToken.getRoles().toArray());
assertEquals("1", parsedToken.getId());
assertEquals("issuer", parsedToken.getIssuer());
assertEquals("subject", parsedToken.getSubject());
assertArrayEquals(new String[] {"audience"}, parsedToken.getAudience().toArray());
assertEquals(Integer.valueOf(123), parsedToken.getExpiration());
assertEquals(Integer.valueOf(456), parsedToken.getIssuedAt());
assertEquals(Integer.valueOf(789), parsedToken.getNotBefore());
}
/**
* Test custom claims.
*/
@Test
public void testCustomClaims() {
JWT token = new JWTBuilder()
.id("1")
.issuer("issuer")
.subject("subject")
.audience("audience")
.expiration(123)
.issuedAt(456)
.notBefore(789)
.claim("roles", "maintainer", "profile")
.claim("ints", 1, 2)
.build();
String jsonString = token.toString();
assertEquals("{\"typ\":\"JWT\"}.{\"jti\":\"1\",\"iss\":\"issuer\",\"sub\":\"subject\",\"aud\":\"audience\",\"exp\":123,\"iat\":456,\"nbf\":789,\"roles\":[\"maintainer\",\"profile\"],\"ints\":[1,2]}", jsonString);
String jsonEncoded = token.encode();
JWT parsedToken = new JWTBuilder().build(jsonEncoded);
assertNotNull(parsedToken);
assertArrayEquals(new String[] {"maintainer", "profile"}, parsedToken.getClaimValues("roles").toArray());
assertArrayEquals(new String[] {"1", "2"}, parsedToken.getClaimValues("ints").toArray());
assertEquals("1", parsedToken.getClaim("ints"));
}
/**
* Test multiple audience.
*/
@Test
public void testMultipleAudience() {
JWT token = new JWTBuilder()
.id("1")
.issuer("issuer")
.subject("subject")
.audience("A", "B", "C")
.expiration(123)
.issuedAt(456)
.notBefore(789)
.build();
String jsonString = token.toString();
assertEquals("{\"typ\":\"JWT\"}.{\"jti\":\"1\",\"iss\":\"issuer\",\"sub\":\"subject\",\"aud\":[\"A\",\"B\",\"C\"],\"exp\":123,\"iat\":456,\"nbf\":789}", jsonString);
String jsonEncoded = token.encode();
JWT parsedToken = new JWTBuilder().build(jsonEncoded);
assertNotNull(parsedToken);
assertEquals("1", parsedToken.getId());
assertEquals("issuer", parsedToken.getIssuer());
assertEquals("subject", parsedToken.getSubject());
assertArrayEquals(new String[] {"A", "B", "C"}, parsedToken.getAudience().toArray());
assertEquals(Integer.valueOf(123), parsedToken.getExpiration());
assertEquals(Integer.valueOf(456), parsedToken.getIssuedAt());
assertEquals(Integer.valueOf(789), parsedToken.getNotBefore());
}
/**
* The Class MyWebToken.
*/
public static class MyWebToken extends JWT {
/** The Constant CLAIM_ROLES. */
public static final String CLAIM_ROLES = "roles";
/**
* Instantiates a new my web token.
*
* @param headers the headers
* @param claims the claims
*/
public MyWebToken(JsonObject headers, JsonObject claims) {
super(headers, claims);
}
/**
* Gets the roles.
*
* @return the roles
*/
public List<String> getRoles() {
List<String> roles = new ArrayList<String>();
for (JsonString string : getClaims().getJsonArray(CLAIM_ROLES).getValuesAs(JsonString.class)) {
roles.add(string.getString());
}
return roles;
}
/**
* The Class MyWebTokenBuilder.
*/
public static class MyWebTokenBuilder extends JWTBuilder<MyWebToken, MyWebTokenBuilder> {
/**
* Instantiates a new my web token builder.
*/
public MyWebTokenBuilder() {
super(MyWebToken.class);
}
/**
* Roles.
*
* @param roles the roles
* @return the my web token builder
*/
public MyWebTokenBuilder roles(String... roles) {
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
for (String role : roles) {
arrayBuilder.add(role);
}
getClaimsBuilder().add(CLAIM_ROLES, arrayBuilder);
return this;
}
}
}
}