From b964565f656fb48568692ecaa08ed5752964d8e8 Mon Sep 17 00:00:00 2001 From: Ricardo Paiva Date: Tue, 29 Oct 2013 10:04:43 -0200 Subject: [PATCH 1/5] Adiciona Google2Api --- .../org/scribe/builder/api/Google2Api.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/main/java/org/scribe/builder/api/Google2Api.java diff --git a/src/main/java/org/scribe/builder/api/Google2Api.java b/src/main/java/org/scribe/builder/api/Google2Api.java new file mode 100644 index 000000000..06a892ba8 --- /dev/null +++ b/src/main/java/org/scribe/builder/api/Google2Api.java @@ -0,0 +1,114 @@ +package org.scribe.builder.api; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.scribe.exceptions.OAuthException; +import org.scribe.extractors.AccessTokenExtractor; +import org.scribe.model.OAuthConfig; +import org.scribe.model.OAuthConstants; +import org.scribe.model.OAuthRequest; +import org.scribe.model.Response; +import org.scribe.model.Token; +import org.scribe.model.Verb; +import org.scribe.model.Verifier; +import org.scribe.oauth.OAuth20ServiceImpl; +import org.scribe.oauth.OAuthService; +import org.scribe.utils.OAuthEncoder; +import org.scribe.utils.Preconditions; + +/** + * Google OAuth2.0 Released under the same license as scribe (MIT License) + * + * @author yincrash + * + */ +public class Google2Api extends DefaultApi20 { + + private static final String AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/auth?response_type=code&approval_prompt=force&access_type=offline&client_id=%s&redirect_uri=%s"; + private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s"; + + @Override + public String getAccessTokenEndpoint() { + return "https://accounts.google.com/o/oauth2/token"; + } + + @Override + public AccessTokenExtractor getAccessTokenExtractor() { + return new AccessTokenExtractor() { + + 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("\"access_token\" : \"([^&\"]+)\"").matcher(response); + if (matcher.find()) { + String token = OAuthEncoder.decode(matcher.group(1)); + return new Token(token, "", response); + } else { + throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null); + } + } + }; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) { + // Append scope if present + if (config.hasScope()) { + return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); + } else { + return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + } + + @Override + public Verb getAccessTokenVerb() { + return Verb.POST; + } + + @Override + public OAuthService createService(OAuthConfig config) { + return new GoogleOAuth2Service(this, config); + } + + private class GoogleOAuth2Service extends OAuth20ServiceImpl { + + private static final String GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"; + private static final String GRANT_TYPE = "grant_type"; + private DefaultApi20 api; + private OAuthConfig config; + + public GoogleOAuth2Service(DefaultApi20 api, OAuthConfig config) { + super(api, config); + this.api = api; + this.config = config; + } + + @Override + public Token getAccessToken(Token requestToken, Verifier verifier) { + OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint()); + switch (api.getAccessTokenVerb()) { + case POST: + request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); + request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); + request.addBodyParameter(OAuthConstants.CODE, verifier.getValue()); + request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); + request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_AUTHORIZATION_CODE); +// if (config.hasScope()) +// request.addBodyParameter(OAuthConstants.SCOPE, config.getScope()); + break; + case GET: + default: + request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); + request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); + request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue()); + request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); + if (config.hasScope()) + request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope()); + } + Response response = request.send(); + return api.getAccessTokenExtractor().extract(response.getBody()); + } + } + +} From 2dfd75185c351d453ad4a4716a60441a325f3b2c Mon Sep 17 00:00:00 2001 From: Ricardo Paiva Date: Tue, 29 Oct 2013 10:04:55 -0200 Subject: [PATCH 2/5] Adiciona InstagramApi --- .../org/scribe/builder/api/InstagramApi.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/main/java/org/scribe/builder/api/InstagramApi.java diff --git a/src/main/java/org/scribe/builder/api/InstagramApi.java b/src/main/java/org/scribe/builder/api/InstagramApi.java new file mode 100644 index 000000000..136604769 --- /dev/null +++ b/src/main/java/org/scribe/builder/api/InstagramApi.java @@ -0,0 +1,65 @@ +package org.scribe.builder.api; + +import org.scribe.builder.api.DefaultApi20; +import org.scribe.extractors.AccessTokenExtractor; +import org.scribe.extractors.JsonTokenExtractor; +import org.scribe.model.OAuthConfig; +import org.scribe.model.OAuthConstants; +import org.scribe.model.OAuthRequest; +import org.scribe.model.Response; +import org.scribe.model.Token; +import org.scribe.model.Verb; +import org.scribe.model.Verifier; +import org.scribe.oauth.OAuth20ServiceImpl; +import org.scribe.oauth.OAuthService; +import org.scribe.utils.OAuthEncoder; + +public class InstagramApi extends DefaultApi20 { + + private static final String URL = "https://api.instagram.com/oauth/authorize/?client_id=%s&redirect_uri=%s&response_type=code"; + + @Override + public Verb getAccessTokenVerb() { + return Verb.POST; + } + + @Override + public String getAccessTokenEndpoint() { + return "https://api.instagram.com/oauth/access_token"; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) { + return String.format(URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + + @Override + public AccessTokenExtractor getAccessTokenExtractor() { + return new JsonTokenExtractor(); + } + + /** + * Not sure if it's a Scribe bug or an Instagram oddity. We have to send the various parameters in the POST body (Scribe sends them as query string) and we must include the 'grant_type'. + */ + @Override + public OAuthService createService(final OAuthConfig config) { + return new OAuth20ServiceImpl(this, config) { + @Override + public Token getAccessToken(Token requestToken, Verifier verifier) { + OAuthRequest request = new OAuthRequest(getAccessTokenVerb(), getAccessTokenEndpoint()); + + request.addBodyParameter("grant_type", "authorization_code"); + request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); + request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); + request.addBodyParameter(OAuthConstants.CODE, verifier.getValue()); + request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); + + if (config.hasScope()) + request.addBodyParameter(OAuthConstants.SCOPE, config.getScope()); + + Response response = request.send(); + return getAccessTokenExtractor().extract(response.getBody()); + } + }; + } +} \ No newline at end of file From 9500063e135bc30b7568b13318b522059ae54636 Mon Sep 17 00:00:00 2001 From: Ricardo Paiva Date: Tue, 29 Oct 2013 10:05:24 -0200 Subject: [PATCH 3/5] Adiciona "+" no Encoder --- src/main/java/org/scribe/utils/OAuthEncoder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/scribe/utils/OAuthEncoder.java b/src/main/java/org/scribe/utils/OAuthEncoder.java index 7fdbc84cc..099a916e9 100644 --- a/src/main/java/org/scribe/utils/OAuthEncoder.java +++ b/src/main/java/org/scribe/utils/OAuthEncoder.java @@ -18,8 +18,9 @@ public class OAuthEncoder { Map rules = new HashMap(); rules.put("*", "%2A"); - rules.put("+", "%20"); +// rules.put("+", "%20"); rules.put("%7E", "~"); + rules.put("%2B", "+"); ENCODING_RULES = Collections.unmodifiableMap(rules); } From 6206f445be0889f1e7ce435224684be2dc8ce756 Mon Sep 17 00:00:00 2001 From: Ricardo Paiva Date: Tue, 29 Oct 2013 10:05:32 -0200 Subject: [PATCH 4/5] Testes --- pom.xml | 33 ++++ .../org/scribe/builder/api/Twitter2Api.java | 114 ++++++++++++++ .../org/scribe/examples/FacebookExample.java | 20 ++- .../org/scribe/examples/GoogleExample.java | 5 +- .../org/scribe/examples/TwitterExample.java | 144 +++++++++++------- 5 files changed, 251 insertions(+), 65 deletions(-) create mode 100644 src/main/java/org/scribe/builder/api/Twitter2Api.java diff --git a/pom.xml b/pom.xml index a276ae1bb..be99ece64 100644 --- a/pom.xml +++ b/pom.xml @@ -94,5 +94,38 @@ + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.codehaus.mojo + + findbugs-maven-plugin + + + [2.5.2,) + + + check + + + + + + + + + + + + diff --git a/src/main/java/org/scribe/builder/api/Twitter2Api.java b/src/main/java/org/scribe/builder/api/Twitter2Api.java new file mode 100644 index 000000000..0c2c694a9 --- /dev/null +++ b/src/main/java/org/scribe/builder/api/Twitter2Api.java @@ -0,0 +1,114 @@ +package org.scribe.builder.api; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.scribe.exceptions.OAuthException; +import org.scribe.extractors.AccessTokenExtractor; +import org.scribe.model.OAuthConfig; +import org.scribe.model.OAuthConstants; +import org.scribe.model.OAuthRequest; +import org.scribe.model.Response; +import org.scribe.model.Token; +import org.scribe.model.Verb; +import org.scribe.model.Verifier; +import org.scribe.oauth.OAuth20ServiceImpl; +import org.scribe.oauth.OAuthService; +import org.scribe.utils.OAuthEncoder; +import org.scribe.utils.Preconditions; + +/** + * Google OAuth2.0 Released under the same license as scribe (MIT License) + * + * @author yincrash + * + */ +public class Twitter2Api extends DefaultApi20 { + + private static final String AUTHORIZE_URL = "https://api.twitter.com/oauth2/token?grant_type=client_credentials"; + private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL; + + @Override + public String getAccessTokenEndpoint() { + return "https://api.twitter.com/oauth2/token"; + } + + @Override + public AccessTokenExtractor getAccessTokenExtractor() { + return new AccessTokenExtractor() { + + 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("\"access_token\" : \"([^&\"]+)\"").matcher(response); + if (matcher.find()) { + String token = OAuthEncoder.decode(matcher.group(1)); + return new Token(token, "", response); + } else { + throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null); + } + } + }; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) { + // Append scope if present + if (config.hasScope()) { + return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); + } else { + return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + } + + @Override + public Verb getAccessTokenVerb() { + return Verb.POST; + } + + @Override + public OAuthService createService(OAuthConfig config) { + return new GoogleOAuth2Service(this, config); + } + + private class GoogleOAuth2Service extends OAuth20ServiceImpl { + + private static final String GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"; + private static final String GRANT_TYPE = "grant_type"; + private DefaultApi20 api; + private OAuthConfig config; + + public GoogleOAuth2Service(DefaultApi20 api, OAuthConfig config) { + super(api, config); + this.api = api; + this.config = config; + } + + @Override + public Token getAccessToken(Token requestToken, Verifier verifier) { + OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint()); + switch (api.getAccessTokenVerb()) { + case POST: + request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); + request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); + request.addBodyParameter(OAuthConstants.CODE, verifier.getValue()); + request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); + request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_AUTHORIZATION_CODE); +// if (config.hasScope()) +// request.addBodyParameter(OAuthConstants.SCOPE, config.getScope()); + break; + case GET: + default: + request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); + request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); + request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue()); + request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); + if (config.hasScope()) + request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope()); + } + Response response = request.send(); + return api.getAccessTokenExtractor().extract(response.getBody()); + } + } + +} diff --git a/src/test/java/org/scribe/examples/FacebookExample.java b/src/test/java/org/scribe/examples/FacebookExample.java index d5dc3cb50..54e34e5e5 100644 --- a/src/test/java/org/scribe/examples/FacebookExample.java +++ b/src/test/java/org/scribe/examples/FacebookExample.java @@ -1,11 +1,15 @@ package org.scribe.examples; -import java.util.*; +import java.util.Scanner; -import org.scribe.builder.*; -import org.scribe.builder.api.*; -import org.scribe.model.*; -import org.scribe.oauth.*; +import org.scribe.builder.ServiceBuilder; +import org.scribe.builder.api.FacebookApi; +import org.scribe.model.OAuthRequest; +import org.scribe.model.Response; +import org.scribe.model.Token; +import org.scribe.model.Verb; +import org.scribe.model.Verifier; +import org.scribe.oauth.OAuthService; public class FacebookExample { @@ -16,13 +20,13 @@ public class FacebookExample public static void main(String[] args) { // Replace these with your own api key and secret - String apiKey = "your_app_id"; - String apiSecret = "your_api_secret"; + String apiKey = "248142785310499"; + String apiSecret = "4056e1a98140e51d433b3ee966958d5d"; OAuthService service = new ServiceBuilder() .provider(FacebookApi.class) .apiKey(apiKey) .apiSecret(apiSecret) - .callback("http://www.example.com/oauth_callback/") + .callback("http://3zyj.localtunnel.com/") .build(); Scanner in = new Scanner(System.in); diff --git a/src/test/java/org/scribe/examples/GoogleExample.java b/src/test/java/org/scribe/examples/GoogleExample.java index fef1b43c9..7b44b9265 100644 --- a/src/test/java/org/scribe/examples/GoogleExample.java +++ b/src/test/java/org/scribe/examples/GoogleExample.java @@ -18,8 +18,8 @@ public static void main(String[] args) { OAuthService service = new ServiceBuilder() .provider(GoogleApi.class) - .apiKey("anonymous") - .apiSecret("anonymous") + .apiKey("217187867916-i4dvf9nujrfb67kk57rp4aqnhfma76gf.apps.googleusercontent.com") + .apiSecret("bFHs_U602ub7lt6At4sBf0NN") .scope(SCOPE) .build(); Scanner in = new Scanner(System.in); @@ -46,6 +46,7 @@ public static void main(String[] args) Token accessToken = service.getAccessToken(requestToken, verifier); System.out.println("Got the Access Token!"); System.out.println("(if your curious it looks like this: " + accessToken + " )"); + System.out.println("body: " + accessToken.getRawResponse()); System.out.println(); // Now let's go and ask for a protected resource! diff --git a/src/test/java/org/scribe/examples/TwitterExample.java b/src/test/java/org/scribe/examples/TwitterExample.java index b68aee087..ba6314508 100644 --- a/src/test/java/org/scribe/examples/TwitterExample.java +++ b/src/test/java/org/scribe/examples/TwitterExample.java @@ -2,60 +2,94 @@ import java.util.Scanner; -import org.scribe.builder.*; -import org.scribe.builder.api.*; -import org.scribe.model.*; -import org.scribe.oauth.*; - -public class TwitterExample -{ - private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1.1/account/verify_credentials.json"; - - public static void main(String[] args) - { - // If you choose to use a callback, "oauth_verifier" will be the return value by Twitter (request param) - OAuthService service = new ServiceBuilder() - .provider(TwitterApi.class) - .apiKey("6icbcAXyZx67r8uTAUM5Qw") - .apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s") - .build(); - Scanner in = new Scanner(System.in); - - System.out.println("=== Twitter's OAuth Workflow ==="); - System.out.println(); - - // Obtain the Request Token - System.out.println("Fetching the Request Token..."); - Token requestToken = service.getRequestToken(); - System.out.println("Got the Request Token!"); - System.out.println(); - - System.out.println("Now go and authorize Scribe here:"); - System.out.println(service.getAuthorizationUrl(requestToken)); - System.out.println("And paste the verifier here"); - System.out.print(">>"); - Verifier verifier = new Verifier(in.nextLine()); - System.out.println(); - - // Trade the Request Token and Verfier for the Access Token - System.out.println("Trading the Request Token for an Access Token..."); - Token accessToken = service.getAccessToken(requestToken, verifier); - System.out.println("Got the Access Token!"); - System.out.println("(if your curious it looks like this: " + accessToken + " )"); - System.out.println(); - - // Now let's go and ask for a protected resource! - System.out.println("Now we're going to access a protected resource..."); - OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL); - request.addBodyParameter("status", "this is sparta! *"); - service.signRequest(accessToken, request); - Response response = request.send(); - System.out.println("Got it! Lets see what we found..."); - System.out.println(); - System.out.println(response.getBody()); - - System.out.println(); - System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); - } +import org.scribe.builder.ServiceBuilder; +import org.scribe.builder.api.TwitterApi; +import org.scribe.model.OAuthRequest; +import org.scribe.model.Response; +import org.scribe.model.Token; +import org.scribe.model.Verb; +import org.scribe.model.Verifier; +import org.scribe.oauth.OAuth20ServiceImpl; +import org.scribe.oauth.OAuthService; + +public class TwitterExample { + private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1.1/followers/list" + ".json"; + private static final String apiKey = "0r1zVtud6Mrwhuu8fZamGg"; + private static final String apiSecret = "2XCKWwmm6UtDzsvKhYfMdWQaWduLQoIZyRYJlniyrs"; + private static final String callback = "http://focusnetworks.com.br/test"; + private static final String consumerKey = "0r1zVtud6Mrwhuu8fZamGg"; + + public static void main(String[] args) { + // If you choose to use a callback, "oauth_verifier" will be the return value by Twitter (request param) + OAuthService service = new ServiceBuilder().provider(TwitterApi.class) + // .apiKey("6icbcAXyZx67r8uTAUM5Qw") + // .apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s") + .apiKey(apiKey).apiSecret(apiSecret).callback(callback).build(); + Scanner in = new Scanner(System.in); + + System.out.println("=== Twitter's OAuth Workflow ==="); + System.out.println(); + + // Obtain the Request Token + System.out.println("Fetching the Request Token..."); + Token requestToken = service.getRequestToken(); + System.out.println("Got the Request Token!"); + System.out.println(); + + System.out.println("Now go and authorize Scribe here:"); + System.out.println(service.getAuthorizationUrl(requestToken)); + System.out.println("And paste the verifier here"); + System.out.print(">>"); + String strToken = in.nextLine(); + String strVerifier = in.nextLine(); + System.out.println(); + + // Trade the Request Token and Verfier for the Access Token + System.out.println("Trading the Request Token for an Access Token..."); + // Token accessToken = service.getAccessToken(requestToken, verifier); + requestToken = new Token(strToken, consumerKey ); + Verifier verifier = new Verifier(strVerifier); + + Token accessToken = service.getAccessToken(requestToken, verifier); + + System.out.println("Got the Access Token!"); + System.out.println("(if your curious it looks like this: " + accessToken + " )"); + System.out.println(); + + // Now let's go and ask for a protected resource! + System.out.println("Now we're going to access a protected resource..."); + OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL); + // request.addBodyParameter("status", "this is sparta! *"); + service.signRequest(accessToken, request); + Response response = request.send(); + System.out.println("Got it! Lets see what we found..."); + System.out.println(); + System.out.println(response.getBody()); + + System.out.println(); + System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); + } + +// public static void main(String[] args) { +// Scanner in = new Scanner(System.in); +// OAuthService service = new ServiceBuilder().provider(TwitterApi.class).apiKey(apiKey).apiSecret(apiSecret).callback(callback).build(); +// System.out.println("oauth_verifier"); +// String code = in.nextLine(); +// System.out.println("Verifier :: " + code); +// System.out.println("service.getRequestToken()" + service.getRequestToken()); +// session = request.getSession(false); +// Token requestToken = (Token) session.getAttribute("TOKEN"); +// System.out.println("requestToken from Session " + service.getRequestToken().getToken() + " Secr" + service.getRequestToken().getSecret()); +// if (code != null && !code.isEmpty()) { +// System.out.println("Inside code != null Condition"); +// Verifier verifier = new Verifier(code); +// Token accessToken = service.getAccessToken(requestToken, verifier); +// OAuthRequest req = new OAuthRequest(Verb.GET, OAUTH_PROTECTED_URL); +// service.signRequest(accessToken, req); +// Response res = req.send(); +// response.setContentType("text/plain"); +// response.getWriter().println(res.getBody()); +// } +// } } \ No newline at end of file From 2475287ccb6ea408f87ed34f95f01f553e8b7877 Mon Sep 17 00:00:00 2001 From: Ricardo Paiva Date: Tue, 29 Oct 2013 10:11:09 -0200 Subject: [PATCH 5/5] Corrige erros do findbugs --- .../org/scribe/builder/api/Google2Api.java | 2 +- .../org/scribe/builder/api/Twitter2Api.java | 114 ------------------ 2 files changed, 1 insertion(+), 115 deletions(-) delete mode 100644 src/main/java/org/scribe/builder/api/Twitter2Api.java diff --git a/src/main/java/org/scribe/builder/api/Google2Api.java b/src/main/java/org/scribe/builder/api/Google2Api.java index 06a892ba8..b992c6cde 100644 --- a/src/main/java/org/scribe/builder/api/Google2Api.java +++ b/src/main/java/org/scribe/builder/api/Google2Api.java @@ -71,7 +71,7 @@ public OAuthService createService(OAuthConfig config) { return new GoogleOAuth2Service(this, config); } - private class GoogleOAuth2Service extends OAuth20ServiceImpl { + private static class GoogleOAuth2Service extends OAuth20ServiceImpl { private static final String GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"; private static final String GRANT_TYPE = "grant_type"; diff --git a/src/main/java/org/scribe/builder/api/Twitter2Api.java b/src/main/java/org/scribe/builder/api/Twitter2Api.java deleted file mode 100644 index 0c2c694a9..000000000 --- a/src/main/java/org/scribe/builder/api/Twitter2Api.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.scribe.builder.api; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.scribe.exceptions.OAuthException; -import org.scribe.extractors.AccessTokenExtractor; -import org.scribe.model.OAuthConfig; -import org.scribe.model.OAuthConstants; -import org.scribe.model.OAuthRequest; -import org.scribe.model.Response; -import org.scribe.model.Token; -import org.scribe.model.Verb; -import org.scribe.model.Verifier; -import org.scribe.oauth.OAuth20ServiceImpl; -import org.scribe.oauth.OAuthService; -import org.scribe.utils.OAuthEncoder; -import org.scribe.utils.Preconditions; - -/** - * Google OAuth2.0 Released under the same license as scribe (MIT License) - * - * @author yincrash - * - */ -public class Twitter2Api extends DefaultApi20 { - - private static final String AUTHORIZE_URL = "https://api.twitter.com/oauth2/token?grant_type=client_credentials"; - private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL; - - @Override - public String getAccessTokenEndpoint() { - return "https://api.twitter.com/oauth2/token"; - } - - @Override - public AccessTokenExtractor getAccessTokenExtractor() { - return new AccessTokenExtractor() { - - 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("\"access_token\" : \"([^&\"]+)\"").matcher(response); - if (matcher.find()) { - String token = OAuthEncoder.decode(matcher.group(1)); - return new Token(token, "", response); - } else { - throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null); - } - } - }; - } - - @Override - public String getAuthorizationUrl(OAuthConfig config) { - // Append scope if present - if (config.hasScope()) { - return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); - } else { - return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); - } - } - - @Override - public Verb getAccessTokenVerb() { - return Verb.POST; - } - - @Override - public OAuthService createService(OAuthConfig config) { - return new GoogleOAuth2Service(this, config); - } - - private class GoogleOAuth2Service extends OAuth20ServiceImpl { - - private static final String GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"; - private static final String GRANT_TYPE = "grant_type"; - private DefaultApi20 api; - private OAuthConfig config; - - public GoogleOAuth2Service(DefaultApi20 api, OAuthConfig config) { - super(api, config); - this.api = api; - this.config = config; - } - - @Override - public Token getAccessToken(Token requestToken, Verifier verifier) { - OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint()); - switch (api.getAccessTokenVerb()) { - case POST: - request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); - request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); - request.addBodyParameter(OAuthConstants.CODE, verifier.getValue()); - request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); - request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_AUTHORIZATION_CODE); -// if (config.hasScope()) -// request.addBodyParameter(OAuthConstants.SCOPE, config.getScope()); - break; - case GET: - default: - request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey()); - request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret()); - request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue()); - request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); - if (config.hasScope()) - request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope()); - } - Response response = request.send(); - return api.getAccessTokenExtractor().extract(response.getBody()); - } - } - -}