updated date format of token introspection response, closes #719

pull/873/head
Justin Richer 10 years ago
parent 337ee0b165
commit 0fd4e04725

@ -16,16 +16,11 @@
******************************************************************************/
package org.mitre.oauth2.introspectingfilter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
@ -50,13 +45,8 @@ public class OAuth2AccessTokenImpl implements OAuth2AccessToken {
scopes = Sets.newHashSet(Splitter.on(" ").split(token.get("scope").getAsString()));
}
DateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
if (token.get("exp") != null) {
try {
expireDate = dateFormater.parse(token.get("exp").getAsString());
} catch (ParseException ex) {
Logger.getLogger(IntrospectingTokenService.class.getName()).log(Level.SEVERE, null, ex);
}
expireDate = new Date(token.get("exp").getAsLong() * 1000L);
}
}

@ -0,0 +1,90 @@
package org.mitre.oauth2.introspectingfilter;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.Collections;
import java.util.Date;
import java.util.Set;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
import com.google.gson.JsonObject;
public class TestOAuth2AccessTokenImpl {
private static String tokenString = "thisisatokenstring";
private static Set<String> scopes = ImmutableSet.of("bar", "foo");
private static String scopeString = "foo bar";
private static Date exp = new Date(123 * 1000L);
private static Long expVal = 123L;
@Test
public void testFullToken() {
JsonObject tokenObj = new JsonObject();
tokenObj.addProperty("active", true);
tokenObj.addProperty("scope", scopeString);
tokenObj.addProperty("exp", expVal);
tokenObj.addProperty("sub", "subject");
tokenObj.addProperty("client_id", "123-456-789");
OAuth2AccessTokenImpl tok = new OAuth2AccessTokenImpl(tokenObj, tokenString);
assertThat(tok.getScope(), is(equalTo(scopes)));
assertThat(tok.getExpiration(), is(equalTo(exp)));
}
@Test
public void testNullExp() {
JsonObject tokenObj = new JsonObject();
tokenObj.addProperty("active", true);
tokenObj.addProperty("scope", scopeString);
tokenObj.addProperty("sub", "subject");
tokenObj.addProperty("client_id", "123-456-789");
OAuth2AccessTokenImpl tok = new OAuth2AccessTokenImpl(tokenObj, tokenString);
assertThat(tok.getScope(), is(equalTo(scopes)));
assertThat(tok.getExpiration(), is(equalTo(null)));
}
@Test
public void testNullScopes() {
JsonObject tokenObj = new JsonObject();
tokenObj.addProperty("active", true);
tokenObj.addProperty("exp", expVal);
tokenObj.addProperty("sub", "subject");
tokenObj.addProperty("client_id", "123-456-789");
OAuth2AccessTokenImpl tok = new OAuth2AccessTokenImpl(tokenObj, tokenString);
assertThat(tok.getScope(), is(equalTo(Collections.EMPTY_SET)));
assertThat(tok.getExpiration(), is(equalTo(exp)));
}
@Test
public void testNullScopesNullExp() {
JsonObject tokenObj = new JsonObject();
tokenObj.addProperty("active", true);
tokenObj.addProperty("sub", "subject");
tokenObj.addProperty("client_id", "123-456-789");
OAuth2AccessTokenImpl tok = new OAuth2AccessTokenImpl(tokenObj, tokenString);
assertThat(tok.getScope(), is(equalTo(Collections.EMPTY_SET)));
assertThat(tok.getExpiration(), is(equalTo(null)));
}
}

@ -16,17 +16,24 @@
******************************************************************************/
package org.mitre.oauth2.service.impl;
import com.google.common.base.Joiner;
import static com.google.common.collect.Maps.newLinkedHashMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import javax.swing.text.DateFormatter;
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
import org.mitre.oauth2.service.IntrospectionResultAssembler;
import org.mitre.openid.connect.model.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.stereotype.Service;
import java.util.Map;
import static com.google.common.collect.Maps.newLinkedHashMap;
import com.google.common.base.Joiner;
/**
* Default implementation of the {@link IntrospectionResultAssembler} interface.
@ -34,6 +41,10 @@ import static com.google.common.collect.Maps.newLinkedHashMap;
@Service
public class DefaultIntrospectionResultAssembler implements IntrospectionResultAssembler {
private static Logger log = LoggerFactory.getLogger(DefaultIntrospectionResultAssembler.class);
private static DateFormatter dateFormat = new DateFormatter(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"));
@Override
public Map<String, Object> assembleFrom(OAuth2AccessTokenEntity accessToken, UserInfo userInfo) {
@ -45,7 +56,12 @@ public class DefaultIntrospectionResultAssembler implements IntrospectionResultA
result.put("scope", Joiner.on(" ").join(accessToken.getScope()));
if (accessToken.getExpiration() != null) {
result.put("exp", accessToken.getExpiration());
try {
result.put("expires_at", dateFormat.valueToString(accessToken.getExpiration()));
result.put("exp", accessToken.getExpiration().getTime() / 1000L);
} catch (ParseException e) {
log.error("Parse exception in token introspection", e);
}
}
if (userInfo != null) {
@ -76,9 +92,15 @@ public class DefaultIntrospectionResultAssembler implements IntrospectionResultA
result.put("scope", Joiner.on(" ").join(authentication.getOAuth2Request().getScope()));
if (refreshToken.getExpiration() != null) {
result.put("exp", refreshToken.getExpiration());
try {
result.put("expires_at", dateFormat.valueToString(refreshToken.getExpiration()));
result.put("exp", refreshToken.getExpiration().getTime() / 1000L);
} catch (ParseException e) {
log.error("Parse exception in token introspection", e);
}
}
if (userInfo != null) {
// if we have a UserInfo, use that for the subject
result.put("sub", userInfo.getSub());

@ -24,10 +24,14 @@ import org.mitre.openid.connect.model.UserInfo;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.OAuth2Request;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import javax.swing.text.DateFormatter;
import static com.google.common.collect.Sets.newHashSet;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
@ -40,11 +44,13 @@ public class TestDefaultIntrospectionResultAssembler {
private DefaultIntrospectionResultAssembler assembler = new DefaultIntrospectionResultAssembler();
private static DateFormatter dateFormat = new DateFormatter(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"));
@Test
public void shouldAssembleExpectedResultForAccessToken() {
public void shouldAssembleExpectedResultForAccessToken() throws ParseException {
// given
OAuth2AccessTokenEntity accessToken = accessToken(new Date(123), scopes("foo", "bar"), "Bearer",
OAuth2AccessTokenEntity accessToken = accessToken(new Date(123 * 1000L), scopes("foo", "bar"), "Bearer",
authentication("name", request("clientId")));
UserInfo userInfo = userInfo("sub");
@ -56,7 +62,8 @@ public class TestDefaultIntrospectionResultAssembler {
// then
Map<String, Object> expected = new ImmutableMap.Builder<String, Object>()
.put("sub", "sub")
.put("exp", new Date(123))
.put("exp", 123L)
.put("expires_at", dateFormat.valueToString(new Date(123 * 1000L)))
.put("scope", "bar foo")
.put("active", Boolean.TRUE)
.put("user_id", "name")
@ -67,10 +74,10 @@ public class TestDefaultIntrospectionResultAssembler {
}
@Test
public void shouldAssembleExpectedResultForAccessTokenWithoutUserInfo() {
public void shouldAssembleExpectedResultForAccessTokenWithoutUserInfo() throws ParseException {
// given
OAuth2AccessTokenEntity accessToken = accessToken(new Date(123), scopes("foo", "bar"), "Bearer",
OAuth2AccessTokenEntity accessToken = accessToken(new Date(123 * 1000L), scopes("foo", "bar"), "Bearer",
authentication("name", request("clientId")));
// when
@ -80,7 +87,8 @@ public class TestDefaultIntrospectionResultAssembler {
// then
Map<String, Object> expected = new ImmutableMap.Builder<String, Object>()
.put("sub", "name")
.put("exp", new Date(123))
.put("exp", 123L)
.put("expires_at", dateFormat.valueToString(new Date(123 * 1000L)))
.put("scope", "bar foo")
.put("active", Boolean.TRUE)
.put("user_id", "name")
@ -116,10 +124,10 @@ public class TestDefaultIntrospectionResultAssembler {
}
@Test
public void shouldAssembleExpectedResultForRefreshToken() {
public void shouldAssembleExpectedResultForRefreshToken() throws ParseException {
// given
OAuth2RefreshTokenEntity refreshToken = refreshToken(new Date(123),
OAuth2RefreshTokenEntity refreshToken = refreshToken(new Date(123 * 1000L),
authentication("name", request("clientId", scopes("foo", "bar"))));
UserInfo userInfo = userInfo("sub");
@ -131,7 +139,8 @@ public class TestDefaultIntrospectionResultAssembler {
// then
Map<String, Object> expected = new ImmutableMap.Builder<String, Object>()
.put("sub", "sub")
.put("exp", new Date(123))
.put("exp", 123L)
.put("expires_at", dateFormat.valueToString(new Date(123 * 1000L)))
.put("scope", "bar foo")
.put("active", Boolean.TRUE)
.put("user_id", "name")
@ -141,10 +150,10 @@ public class TestDefaultIntrospectionResultAssembler {
}
@Test
public void shouldAssembleExpectedResultForRefreshTokenWithoutUserInfo() {
public void shouldAssembleExpectedResultForRefreshTokenWithoutUserInfo() throws ParseException {
// given
OAuth2RefreshTokenEntity refreshToken = refreshToken(new Date(123),
OAuth2RefreshTokenEntity refreshToken = refreshToken(new Date(123 * 1000L),
authentication("name", request("clientId", scopes("foo", "bar"))));
// when
@ -154,7 +163,8 @@ public class TestDefaultIntrospectionResultAssembler {
// then
Map<String, Object> expected = new ImmutableMap.Builder<String, Object>()
.put("sub", "name")
.put("exp", new Date(123))
.put("exp", 123L)
.put("expires_at", dateFormat.valueToString(new Date(123 * 1000L)))
.put("scope", "bar foo")
.put("active", Boolean.TRUE)
.put("user_id", "name")

Loading…
Cancel
Save