From 7385d3702ede1629446b1ee9e62f4c2a7b42c32b Mon Sep 17 00:00:00 2001 From: diegossilveira Date: Thu, 10 Feb 2011 17:09:11 -0200 Subject: [PATCH] Added specific token extractor for OAuth 2.0 --- .../extractors/TokenExtractor20Impl.java | 35 +++++++++++ .../extractors/TokenExtractor20Test.java | 59 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/main/java/org/scribe/extractors/TokenExtractor20Impl.java create mode 100644 src/test/java/org/scribe/extractors/TokenExtractor20Test.java diff --git a/src/main/java/org/scribe/extractors/TokenExtractor20Impl.java b/src/main/java/org/scribe/extractors/TokenExtractor20Impl.java new file mode 100644 index 0000000..8c956c5 --- /dev/null +++ b/src/main/java/org/scribe/extractors/TokenExtractor20Impl.java @@ -0,0 +1,35 @@ +package org.scribe.extractors; + +import java.util.regex.*; + +import org.scribe.exceptions.*; +import org.scribe.model.*; +import org.scribe.utils.*; + +/** + * Default implementation of {@AccessTokenExtractor}. Conforms to OAuth 2.0 + * + */ +public class TokenExtractor20Impl implements AccessTokenExtractor +{ + private static final String TOKEN_REGEX = "access_token=(\\S*?)(&(\\S*))?"; + private static final String EMPTY_SECRET = ""; + + /** + * {@inheritDoc} + */ + public Token extract(String response) + { + Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string"); + + Matcher matcher = Pattern.compile(TOKEN_REGEX).matcher(response); + if (matcher.matches()) + { + String token = URLUtils.percentDecode(matcher.group(1)); + return new Token(token, EMPTY_SECRET); + } else + { + throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null); + } + } +} diff --git a/src/test/java/org/scribe/extractors/TokenExtractor20Test.java b/src/test/java/org/scribe/extractors/TokenExtractor20Test.java new file mode 100644 index 0000000..167b2d7 --- /dev/null +++ b/src/test/java/org/scribe/extractors/TokenExtractor20Test.java @@ -0,0 +1,59 @@ +package org.scribe.extractors; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.scribe.exceptions.OAuthException; +import org.scribe.model.Token; + +public class TokenExtractor20Test +{ + + private TokenExtractor20Impl extractor; + + @Before + public void setup() + { + extractor = new TokenExtractor20Impl(); + } + + @Test + public void shouldExtractTokenFromOAuthStandardResponse() + { + String response = "access_token=166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE"; + Token extracted = extractor.extract(response); + assertEquals("166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE", extracted.getToken()); + assertEquals("", extracted.getSecret()); + } + + @Test + public void shouldExtractTokenFromResponseWithExpiresParam() + { + String response = "access_token=166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE&expires=5108"; + Token extracted = extractor.extract(response); + assertEquals("166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE", extracted.getToken()); + assertEquals("", extracted.getSecret()); + } + + @Test(expected = OAuthException.class) + public void shouldThrowExceptionIfTokenIsAbsent() + { + String response = "&expires=5108"; + extractor.extract(response); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionIfResponseIsNull() + { + String response = null; + extractor.extract(response); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionIfResponseIsEmptyString() + { + String response = ""; + extractor.extract(response); + } +}