diff --git a/src/main/java/org/scribe/builder/ServiceBuilder.java b/src/main/java/org/scribe/builder/ServiceBuilder.java index dd7a893..7939287 100644 --- a/src/main/java/org/scribe/builder/ServiceBuilder.java +++ b/src/main/java/org/scribe/builder/ServiceBuilder.java @@ -20,6 +20,7 @@ public class ServiceBuilder private String apiSecret; private String callback; private Api api; + private String scope; public ServiceBuilder() { @@ -92,6 +93,18 @@ public class ServiceBuilder return this; } + /** + * Configures the OAuth scope. This is only necessary in some APIs (like Google's). + * + * @param scope The OAuth scope + * @return the {@link ServiceBuilder} instance for method chaining + */ + public ServiceBuilder scope(String scope) + { + this.scope = scope; + return this; + } + /** * Returns the fully configured {@link OAuthService} * @@ -102,6 +115,6 @@ public class ServiceBuilder Preconditions.checkNotNull(api, "You must specify a valid api through the provider() method"); Preconditions.checkEmptyString(apiKey, "You must provide an api key"); Preconditions.checkEmptyString(apiSecret, "You must provide an api secret"); - return api.createService(apiKey, apiSecret, callback); + return api.createService(apiKey, apiSecret, callback, scope); } } diff --git a/src/main/java/org/scribe/builder/api/Api.java b/src/main/java/org/scribe/builder/api/Api.java index 50d6d45..9a568a9 100644 --- a/src/main/java/org/scribe/builder/api/Api.java +++ b/src/main/java/org/scribe/builder/api/Api.java @@ -20,4 +20,16 @@ public interface Api * @return fully configured {@link OAuthService} */ OAuthService createService(String apiKey, String apiSecret, String callback); + + /** + * Creates an {@link OAuthService} + * + * @param apiKey your application api key + * @param apiSecret your application api secret + * @param callback the callback url (or 'oob' for out of band OAuth) + * @param scope the OAuth scope + * + * @return fully configured {@link OAuthService} + */ + OAuthService createService(String apiKey, String apiSecret, String callback, String scope); } diff --git a/src/main/java/org/scribe/builder/api/DefaultApi10a.java b/src/main/java/org/scribe/builder/api/DefaultApi10a.java index 32c4478..c5d0a54 100644 --- a/src/main/java/org/scribe/builder/api/DefaultApi10a.java +++ b/src/main/java/org/scribe/builder/api/DefaultApi10a.java @@ -50,7 +50,6 @@ public abstract class DefaultApi10a implements Api public abstract String getRequestTokenEndpoint(); public abstract String getAccessTokenEndpoint(); - @Override public OAuthService createService(String apiKey, String apiSecret, String callback) { return new OAuth10aServiceImpl( getSignatureService(), @@ -61,6 +60,13 @@ public abstract class DefaultApi10a implements Api getAccessTokenExtractor(), createConfig(apiKey, apiSecret, callback)); } + + public OAuthService createService(String apiKey, String apiSecret, String callback, String scope) + { + OAuthService service = createService(apiKey, apiSecret, callback); + service.addScope(scope); + return service; + } private OAuthConfig createConfig(String apiKey, String apiSecret, String callback) { diff --git a/src/main/java/org/scribe/model/OAuthConstants.java b/src/main/java/org/scribe/model/OAuthConstants.java index 51ac9a3..2c18624 100644 --- a/src/main/java/org/scribe/model/OAuthConstants.java +++ b/src/main/java/org/scribe/model/OAuthConstants.java @@ -38,4 +38,5 @@ public class OAuthConstants public static final String VERIFIER = "oauth_verifier"; public static final String HEADER = "Authorization"; public static final Token EMPTY_TOKEN = new Token("", ""); + public static final String SCOPE = "scope"; } diff --git a/src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java b/src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java index 5545cc9..2e6562c 100644 --- a/src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java +++ b/src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java @@ -6,7 +6,7 @@ import org.scribe.services.*; public class OAuth10aServiceImpl implements OAuthService { - + private static final String NO_SCOPE = null; private static final String VERSION = "1.0"; private OAuthConfig config; @@ -16,6 +16,7 @@ public class OAuth10aServiceImpl implements OAuthService private HeaderExtractor headerExtractor; private RequestTokenExtractor rtExtractor; private AccessTokenExtractor atExtractor; + private String scope; public OAuth10aServiceImpl(SignatureService signatureService, TimestampService timestampService, BaseStringExtractor baseStringExtractor, HeaderExtractor headerExtractor, RequestTokenExtractor rtExtractor, AccessTokenExtractor atExtractor, OAuthConfig config) @@ -27,6 +28,7 @@ public class OAuth10aServiceImpl implements OAuthService this.rtExtractor = rtExtractor; this.atExtractor = atExtractor; this.config = config; + this.scope = NO_SCOPE; } public Token getRequestToken() @@ -47,6 +49,10 @@ public class OAuth10aServiceImpl implements OAuthService request.addOAuthParameter(OAuthConstants.VERSION, getVersion()); request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback()); request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token)); + if(scope != NO_SCOPE) + { + request.addOAuthParameter(OAuthConstants.SCOPE, scope); + } } public Token getAccessToken(Token requestToken, Verifier verifier) @@ -72,6 +78,11 @@ public class OAuth10aServiceImpl implements OAuthService return VERSION; } + public void addScope(String scope) + { + this.scope = scope; + } + private String getSignature(OAuthRequest request, Token token) { String baseString = baseStringExtractor.extract(request); diff --git a/src/main/java/org/scribe/oauth/OAuthService.java b/src/main/java/org/scribe/oauth/OAuthService.java index 50db621..18da2f0 100644 --- a/src/main/java/org/scribe/oauth/OAuthService.java +++ b/src/main/java/org/scribe/oauth/OAuthService.java @@ -11,4 +11,6 @@ public interface OAuthService public void signRequest(Token accessToken, OAuthRequest request); public String getVersion(); + + public void addScope(String scope); }