diff --git a/facebook4j-core/src/main/java/facebook4j/FacebookBaseImpl.java b/facebook4j-core/src/main/java/facebook4j/FacebookBaseImpl.java index 35776f72..4cf4c7be 100644 --- a/facebook4j-core/src/main/java/facebook4j/FacebookBaseImpl.java +++ b/facebook4j-core/src/main/java/facebook4j/FacebookBaseImpl.java @@ -286,6 +286,14 @@ public AccessToken extendTokenExpiration() throws FacebookException { return extendTokenExpiration(getOAuth().getOAuthAccessToken().getToken()); } + public AccessToken getOAuthAccessTokenInfo(String accessToken) throws FacebookException { + return getOAuth().getOAuthAccessTokenInfo(accessToken); + } + + public AccessToken getOAuthAccessTokenInfo() throws FacebookException { + return getOAuth().getOAuthAccessTokenInfo(); + } + private OAuthSupport getOAuth() { if (!(auth instanceof OAuthSupport)) { throw new IllegalStateException("OAuth app id/secret combination not supplied"); diff --git a/facebook4j-core/src/main/java/facebook4j/auth/OAuthAuthorization.java b/facebook4j-core/src/main/java/facebook4j/auth/OAuthAuthorization.java index 7ea5f1b1..d82009a4 100644 --- a/facebook4j-core/src/main/java/facebook4j/auth/OAuthAuthorization.java +++ b/facebook4j-core/src/main/java/facebook4j/auth/OAuthAuthorization.java @@ -224,6 +224,25 @@ protected String getExtendTokenURL(String shortLivedToken) { "&fb_exchange_token=" + shortLivedToken; } + public AccessToken getOAuthAccessTokenInfo(String accessToken) throws FacebookException { + String url = getAccessTokenInfoURL(accessToken); + HttpResponse response = http.get(url); + if (response.getStatusCode() != 200) { + throw new FacebookException("authorization failed."); + } + return new AccessToken(response); + } + + public AccessToken getOAuthAccessTokenInfo() throws FacebookException { + return getOAuthAccessTokenInfo(this.oauthToken.getToken()); + } + + protected String getAccessTokenInfoURL(String accessToken) { + return conf.getOAuthAccessTokenInfoURL() + + "?client_id=" + this.appId + + "&access_token=" + accessToken; + } + public void setAppSecretProofEnabled(boolean enabled) { this.appSecretProofEnabled = enabled; diff --git a/facebook4j-core/src/main/java/facebook4j/auth/OAuthSupport.java b/facebook4j-core/src/main/java/facebook4j/auth/OAuthSupport.java index 9f61cd30..5a08a9de 100644 --- a/facebook4j-core/src/main/java/facebook4j/auth/OAuthSupport.java +++ b/facebook4j-core/src/main/java/facebook4j/auth/OAuthSupport.java @@ -129,4 +129,18 @@ public interface OAuthSupport { */ AccessToken extendTokenExpiration(String shortLivedToken) throws FacebookException; + /** + * Returns the access token information. + * @param accessToken access token + * @return access token information + * @throws FacebookException when Facebook service or network is unavailable, or the user has not authorized + */ + AccessToken getOAuthAccessTokenInfo(String accessToken) throws FacebookException; + + /** + * Returns the access token information. + * @return access token information + * @throws FacebookException when Facebook service or network is unavailable, or the user has not authorized + */ + AccessToken getOAuthAccessTokenInfo() throws FacebookException; } diff --git a/facebook4j-core/src/main/java/facebook4j/conf/Configuration.java b/facebook4j-core/src/main/java/facebook4j/conf/Configuration.java index a4549e5d..61e3e2be 100644 --- a/facebook4j-core/src/main/java/facebook4j/conf/Configuration.java +++ b/facebook4j-core/src/main/java/facebook4j/conf/Configuration.java @@ -52,6 +52,8 @@ public interface Configuration extends HttpClientConfiguration String getOAuthAccessTokenURL(); + String getOAuthAccessTokenInfoURL(); + String getOAuthDeviceTokenURL(); boolean isJSONStoreEnabled(); diff --git a/facebook4j-core/src/main/java/facebook4j/conf/ConfigurationBase.java b/facebook4j-core/src/main/java/facebook4j/conf/ConfigurationBase.java index f85c9c20..baf548ae 100644 --- a/facebook4j-core/src/main/java/facebook4j/conf/ConfigurationBase.java +++ b/facebook4j-core/src/main/java/facebook4j/conf/ConfigurationBase.java @@ -66,6 +66,7 @@ public class ConfigurationBase implements Configuration, Serializable { private String oAuthAuthorizationURL; private String oAuthAccessTokenURL; + private String oAuthAccessTokenInfoURL; private String oAuthDeviceTokenURL; private String restBaseURL; @@ -84,6 +85,7 @@ public class ConfigurationBase implements Configuration, Serializable { private static final String DEFAULT_OAUTH_AUTHORIZATION_URL = "http://www.facebook.com/dialog/oauth"; private static final String DEFAULT_OAUTH_ACCESS_TOKEN_URL = "http://graph.facebook.com/oauth/access_token"; + private static final String DEFAULT_OAUTH_ACCESS_TOKEN_INFO_URL = "http://graph.facebook.com/oauth/access_token_info"; private static final String DEFAULT_OAUTH_DEVICE_TOKEN_URL = "http://graph.facebook.com/oauth/device"; private static final String DEFAULT_REST_BASE_URL = "http://graph.facebook.com/"; @@ -147,6 +149,7 @@ protected ConfigurationBase() { setOAuthAuthorizationURL(DEFAULT_OAUTH_AUTHORIZATION_URL); setOAuthAccessTokenURL(DEFAULT_OAUTH_ACCESS_TOKEN_URL); + setOAuthAccessTokenInfoURL(DEFAULT_OAUTH_ACCESS_TOKEN_INFO_URL); setOAuthDeviceTokenURL(DEFAULT_OAUTH_DEVICE_TOKEN_URL); setRestBaseURL(DEFAULT_REST_BASE_URL); @@ -395,6 +398,9 @@ private void fixRestBaseURL() { if (DEFAULT_OAUTH_ACCESS_TOKEN_URL.equals(fixURL(false, oAuthAccessTokenURL))) { this.oAuthAccessTokenURL = fixURL(useSSL, oAuthAccessTokenURL); } + if (DEFAULT_OAUTH_ACCESS_TOKEN_INFO_URL.equals(fixURL(false, oAuthAccessTokenInfoURL))) { + this.oAuthAccessTokenInfoURL = fixURL(useSSL, oAuthAccessTokenInfoURL); + } if (DEFAULT_OAUTH_DEVICE_TOKEN_URL.equals(fixURL(false, oAuthDeviceTokenURL))) { this.oAuthDeviceTokenURL = fixURL(useSSL, oAuthDeviceTokenURL); } @@ -432,6 +438,15 @@ protected final void setOAuthAccessTokenURL(String oAuthAccessTokenURL) { fixRestBaseURL(); } + public String getOAuthAccessTokenInfoURL() { + return oAuthAccessTokenInfoURL; + } + + protected final void setOAuthAccessTokenInfoURL(String oAuthAccessTokenInfoURL) { + this.oAuthAccessTokenInfoURL = oAuthAccessTokenInfoURL; + fixRestBaseURL(); + } + public String getOAuthDeviceTokenURL() { return oAuthDeviceTokenURL; } @@ -532,6 +547,7 @@ public int hashCode() { result = 31 * result + appSecretProofCacheSize; result = 31 * result + (oAuthAuthorizationURL != null ? oAuthAuthorizationURL.hashCode() : 0); result = 31 * result + (oAuthAccessTokenURL != null ? oAuthAccessTokenURL.hashCode() : 0); + result = 31 * result + (oAuthAccessTokenInfoURL != null ? oAuthAccessTokenInfoURL.hashCode() : 0); result = 31 * result + (oAuthDeviceTokenURL != null ? oAuthDeviceTokenURL.hashCode() : 0); result = 31 * result + (restBaseURL != null ? restBaseURL.hashCode() : 0); result = 31 * result + (videoBaseURL != null ? videoBaseURL.hashCode() : 0); @@ -581,6 +597,8 @@ public boolean equals(Object o) { return false; if (oAuthAccessTokenURL != null ? !oAuthAccessTokenURL.equals(that.oAuthAccessTokenURL) : that.oAuthAccessTokenURL != null) return false; + if (oAuthAccessTokenInfoURL != null ? !oAuthAccessTokenInfoURL.equals(that.oAuthAccessTokenInfoURL) : that.oAuthAccessTokenInfoURL != null) + return false; if (oAuthDeviceTokenURL != null ? !oAuthDeviceTokenURL.equals(that.oAuthDeviceTokenURL) : that.oAuthDeviceTokenURL != null) return false; if (oAuthAppId != null ? !oAuthAppId.equals(that.oAuthAppId) : that.oAuthAppId != null) return false; @@ -632,6 +650,7 @@ public String toString() { ", appSecretProofCacheSize=" + appSecretProofCacheSize + ", oAuthAuthorizationURL='" + oAuthAuthorizationURL + '\'' + ", oAuthAccessTokenURL='" + oAuthAccessTokenURL + '\'' + + ", oAuthAccessTokenInfoURL='" + oAuthAccessTokenInfoURL + '\'' + ", oAuthDeviceTokenURL='" + oAuthDeviceTokenURL + '\'' + ", restBaseURL='" + restBaseURL + '\'' + ", videoBaseURL='" + videoBaseURL + '\'' + diff --git a/facebook4j-core/src/main/java/facebook4j/conf/PropertyConfiguration.java b/facebook4j-core/src/main/java/facebook4j/conf/PropertyConfiguration.java index d13ce8f8..20fde89c 100644 --- a/facebook4j-core/src/main/java/facebook4j/conf/PropertyConfiguration.java +++ b/facebook4j-core/src/main/java/facebook4j/conf/PropertyConfiguration.java @@ -37,7 +37,7 @@ * */ public final class PropertyConfiguration extends ConfigurationBase implements Serializable { - private static final long serialVersionUID = -2795427346026618896L; + private static final long serialVersionUID = -6424033561218975631L; public static final String DEBUG = "debug"; public static final String HTTP_USER_AGENT = "http.userAgent"; @@ -71,6 +71,7 @@ public final class PropertyConfiguration extends ConfigurationBase implements Se public static final String OAUTH_AUTHORIZATION_URL = "oauth.authorizationURL"; public static final String OAUTH_ACCESS_TOKEN_URL = "oauth.accessTokenURL"; + public static final String OAUTH_ACCESS_TOKEN_INFO_URL = "oauth.accessTokenInfoURL"; public static final String OAUTH_DEVICE_TOKEN_URL = "oauth.deviceTokenURL"; public static final String REST_BASE_URL = "restBaseURL"; @@ -306,6 +307,10 @@ private void setFieldsWithPrefix(Properties props, String prefix) { setOAuthAccessTokenURL(getString(props, prefix, OAUTH_ACCESS_TOKEN_URL)); } + if (notNull(props, prefix, OAUTH_ACCESS_TOKEN_INFO_URL)) { + setOAuthAccessTokenInfoURL(getString(props, prefix, OAUTH_ACCESS_TOKEN_INFO_URL)); + } + if (notNull(props, prefix, OAUTH_DEVICE_TOKEN_URL)) { setOAuthDeviceTokenURL(getString(props, prefix, OAUTH_DEVICE_TOKEN_URL)); } diff --git a/facebook4j-core/src/test/java/facebook4j/auth/OAuthAuthorizationTest.java b/facebook4j-core/src/test/java/facebook4j/auth/OAuthAuthorizationTest.java index e9255543..c1025dc0 100644 --- a/facebook4j-core/src/test/java/facebook4j/auth/OAuthAuthorizationTest.java +++ b/facebook4j-core/src/test/java/facebook4j/auth/OAuthAuthorizationTest.java @@ -48,6 +48,23 @@ public void shortToLong() throws Exception { } } + public static class AccessTokenInfo extends FacebookTestBase { + @Test + @Category(RealAPITests.class) + public void string() throws Exception { + Facebook facebook = FacebookFactory.getSingleton(); + String oAuthAppId = p.getProperty("oauth.appId"); + String oAuthAppSecret = p.getProperty("oauth.appSecret"); + facebook.setOAuthAppId(oAuthAppId, oAuthAppSecret); + + String accessToken = "your-access-token"; + AccessToken accessTokenInfo = facebook.getOAuthAccessTokenInfo(accessToken); + assertThat(accessTokenInfo.getToken(), is(accessToken)); + assertThat(accessTokenInfo.getExpires(), is(notNullValue())); + assertThat(accessTokenInfo.getType(), is(notNullValue())); + } + } + public static class AppSecretProof { @Test public void defaultCacheSize() throws Exception { diff --git a/facebook4j-core/src/test/java/facebook4j/conf/ConfigurationTest.java b/facebook4j-core/src/test/java/facebook4j/conf/ConfigurationTest.java index 2e0554e1..3f6830fc 100644 --- a/facebook4j-core/src/test/java/facebook4j/conf/ConfigurationTest.java +++ b/facebook4j-core/src/test/java/facebook4j/conf/ConfigurationTest.java @@ -163,6 +163,10 @@ public void configuration() throws Exception { conf = new PropertyConfiguration(); assertThat(conf.getOAuthCallbackURL(), is("http://localhost:8080/callback")); + writeFile("./facebook4j.properties", "oauth.accessTokenInfoURL=https://graph.facebook.com/oauth/access_token_info2"); + conf = new PropertyConfiguration(); + assertThat(conf.getOAuthAccessTokenInfoURL(), is("https://graph.facebook.com/oauth/access_token_info2")); + writeFile("./facebook4j.properties", "oauth.deviceTokenURL=https://graph.facebook.com/oauth/deviceA"); conf = new PropertyConfiguration(); assertThat(conf.getOAuthDeviceTokenURL(), is("https://graph.facebook.com/oauth/deviceA"));