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/Google2Api.java b/src/main/java/org/scribe/builder/api/Google2Api.java
new file mode 100644
index 000000000..b992c6cde
--- /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 static 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/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
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);
}
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