Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1932ad28c1 | ||
|
|
7f89dc3546 | ||
|
|
f3c0a179f3 | ||
|
|
d8e384f9c7 | ||
|
|
35ca23f442 | ||
|
|
93602c4120 | ||
|
|
62b43855c2 | ||
|
|
a62fa36da0 | ||
|
|
1d59fbd014 | ||
|
|
79fa710e47 | ||
|
|
079ce6a2c2 | ||
|
|
d800ece6a6 | ||
|
|
c86d7174af | ||
|
|
5f47bebced | ||
|
|
10c56bda27 | ||
|
|
1be46776e5 | ||
|
|
cc5a0a0471 | ||
|
|
0c3fc722b1 | ||
|
|
203cf83dc0 | ||
|
|
7b587c3d1d | ||
|
|
f89279c682 | ||
|
|
7b6b9056d3 | ||
|
|
ca7950004b | ||
|
|
543b53475f | ||
|
|
de1ac1f467 | ||
|
|
97f45d75e7 | ||
|
|
624fdfb714 | ||
|
|
bd51ae9f25 | ||
|
|
40ab98d506 | ||
|
|
0abe7f80d4 | ||
|
|
592b1b5fdd | ||
|
|
2112d3d8a9 | ||
|
|
109c93b4e4 | ||
|
|
41b6da1a44 | ||
|
|
91cb9b8407 | ||
|
|
c265e730a3 | ||
|
|
5719d7a18a | ||
|
|
8abdde928a | ||
|
|
193dcd2e25 | ||
|
|
931236561a | ||
|
|
5f40e0dca0 | ||
|
|
8afb142b7f | ||
|
|
bfcf0655da | ||
|
|
db88d53807 | ||
|
|
cbfd88d749 | ||
|
|
1eb0b1003c | ||
|
|
75bcb0013d | ||
|
|
145c009fc3 |
No files matched your search
@@ -5,6 +5,11 @@
|
|||||||
.project
|
.project
|
||||||
.settings
|
.settings
|
||||||
|
|
||||||
|
# IntelliJ Idea settings
|
||||||
|
|
||||||
|
.idea
|
||||||
|
scribe.iml
|
||||||
|
|
||||||
# Binaries
|
# Binaries
|
||||||
|
|
||||||
target
|
target
|
||||||
+3
-3
@@ -1,5 +1,3 @@
|
|||||||
!http://img411.imageshack.us/img411/2851/scribelogo.png!
|
|
||||||
|
|
||||||
h2. Welcome to the home of Scribe, the simple OAuth Java lib!
|
h2. Welcome to the home of Scribe, the simple OAuth Java lib!
|
||||||
|
|
||||||
h1. Why use Scribe?
|
h1. Why use Scribe?
|
||||||
@@ -40,6 +38,8 @@ h3. Supports all major 1.0a and 2.0 OAuth APIs out-of-the-box
|
|||||||
|
|
||||||
* Yammer
|
* Yammer
|
||||||
|
|
||||||
|
* Windows Live
|
||||||
|
|
||||||
* and many more! check the "examples folder":http://github.com/fernandezpablo85/scribe-java/tree/master/src/test/java/org/scribe/examples
|
* and many more! check the "examples folder":http://github.com/fernandezpablo85/scribe-java/tree/master/src/test/java/org/scribe/examples
|
||||||
|
|
||||||
h3. Small and modular
|
h3. Small and modular
|
||||||
@@ -63,7 +63,7 @@ You can pull scribe from a maven repository, just add this to your __pom.xml__ f
|
|||||||
@<dependency>@
|
@<dependency>@
|
||||||
@<groupId>org.scribe</groupId>@
|
@<groupId>org.scribe</groupId>@
|
||||||
@<artifactId>scribe</artifactId>@
|
@<artifactId>scribe</artifactId>@
|
||||||
@<version>1.1.2</version>@
|
@<version>1.2.1</version>@
|
||||||
@</dependency>@
|
@</dependency>@
|
||||||
|
|
||||||
h1. Getting started in less than 2 minutes
|
h1. Getting started in less than 2 minutes
|
||||||
|
|||||||
@@ -35,3 +35,28 @@
|
|||||||
[1.1.2]
|
[1.1.2]
|
||||||
|
|
||||||
* FIX: Fixed ugly bug that made 1.1.1 practically unusable (thanks Stubbs)
|
* FIX: Fixed ugly bug that made 1.1.1 practically unusable (thanks Stubbs)
|
||||||
|
|
||||||
|
[1.1.3]
|
||||||
|
|
||||||
|
* FEATURE: Added rawResponse to Token, for extracting additional parameters (thanks Dirk McCormick)
|
||||||
|
* FEATURE: Added Dropbox Api
|
||||||
|
* FIX: Token responses now work despite of the token/secret order
|
||||||
|
* FEATURE: Added Foursquare OAuth 2.0 Api (thanks Tom Tasche)
|
||||||
|
* FEATURE: Added support for OAuth1.0a signatures via querystring parameters
|
||||||
|
* FEATURE: Added ConstantContact Api (thanks Matthew Laudato)
|
||||||
|
|
||||||
|
[1.2]
|
||||||
|
* REFACTOR: Moved scope inside OAuthConfig (breaks backwards compatibility)
|
||||||
|
* FEATURE: Added scopes to Facebook 2.0 Api
|
||||||
|
* FEATURE: Added Plaintext signature for Yammer
|
||||||
|
* FEATURE: Added Twitter SSL endpoints (use TwitterApi.SSL.class)
|
||||||
|
|
||||||
|
[1.2.1]
|
||||||
|
* FEATURE: Added custom charset support to Request (thanks Eric Genet)
|
||||||
|
* FEATURE: Added support for Vkontakte (thanks dotbg)
|
||||||
|
* FEATURE: Added Sohu Weibo, Netease Weibo & Sina Weibo Apis (thanks Arthur Wang)
|
||||||
|
* FEATURE: Added support for persistent Http Connections (thanks Craig Minton)
|
||||||
|
[1.2.2]
|
||||||
|
* FIX: Fixed error while setting connection timeouts
|
||||||
|
* FEATURE: Plurk Api
|
||||||
|
* FEATURE: Windows Live Api
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<groupId>org.scribe</groupId>
|
<groupId>org.scribe</groupId>
|
||||||
<artifactId>scribe</artifactId>
|
<artifactId>scribe</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<version>1.1.2</version>
|
<version>1.2.1</version>
|
||||||
<name>Scribe OAuth Library</name>
|
<name>Scribe OAuth Library</name>
|
||||||
<description>The best OAuth library out there</description>
|
<description>The best OAuth library out there</description>
|
||||||
<url>http://github.com/fernandezpablo85/scribe-java</url>
|
<url>http://github.com/fernandezpablo85/scribe-java</url>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public class ServiceBuilder
|
|||||||
private String callback;
|
private String callback;
|
||||||
private Api api;
|
private Api api;
|
||||||
private String scope;
|
private String scope;
|
||||||
|
private SignatureType signatureType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
@@ -123,6 +124,19 @@ public class ServiceBuilder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the signature type, choose between header, querystring, etc. Defaults to Header
|
||||||
|
*
|
||||||
|
* @param scope The OAuth scope
|
||||||
|
* @return the {@link ServiceBuilder} instance for method chaining
|
||||||
|
*/
|
||||||
|
public ServiceBuilder signatureType(SignatureType type)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(type, "Signature type can't be null");
|
||||||
|
this.signatureType = type;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the fully configured {@link OAuthService}
|
* Returns the fully configured {@link OAuthService}
|
||||||
*
|
*
|
||||||
@@ -133,6 +147,6 @@ public class ServiceBuilder
|
|||||||
Preconditions.checkNotNull(api, "You must specify a valid api through the provider() method");
|
Preconditions.checkNotNull(api, "You must specify a valid api through the provider() method");
|
||||||
Preconditions.checkEmptyString(apiKey, "You must provide an api key");
|
Preconditions.checkEmptyString(apiKey, "You must provide an api key");
|
||||||
Preconditions.checkEmptyString(apiSecret, "You must provide an api secret");
|
Preconditions.checkEmptyString(apiSecret, "You must provide an api secret");
|
||||||
return api.createService(new OAuthConfig(apiKey, apiSecret, callback), scope);
|
return api.createService(new OAuthConfig(apiKey, apiSecret, callback, signatureType, scope));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,5 +21,5 @@ public interface Api
|
|||||||
*
|
*
|
||||||
* @return fully configured {@link OAuthService}
|
* @return fully configured {@link OAuthService}
|
||||||
*/
|
*/
|
||||||
OAuthService createService(OAuthConfig config, String scope);
|
OAuthService createService(OAuthConfig config);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class ConstantContactApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZE_URL = "https://oauth.constantcontact.com/ws/oauth/confirm_access?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://oauth.constantcontact.com/ws/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://oauth.constantcontact.com/ws/oauth/request_token";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -134,14 +134,7 @@ public abstract class DefaultApi10a implements Api
|
|||||||
* @param callback OAuth callback (either URL or 'oob')
|
* @param callback OAuth callback (either URL or 'oob')
|
||||||
* @param scope OAuth scope (optional)
|
* @param scope OAuth scope (optional)
|
||||||
*/
|
*/
|
||||||
public OAuthService createService(OAuthConfig config, String scope)
|
public OAuthService createService(OAuthConfig config)
|
||||||
{
|
|
||||||
OAuthService service = doCreateService(config);
|
|
||||||
service.addScope(scope);
|
|
||||||
return service;
|
|
||||||
}
|
|
||||||
|
|
||||||
private OAuthService doCreateService(OAuthConfig config)
|
|
||||||
{
|
{
|
||||||
return new OAuth10aServiceImpl(this, config);
|
return new OAuth10aServiceImpl(this, config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public abstract class DefaultApi20 implements Api
|
|||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public OAuthService createService(OAuthConfig config, String scope)
|
public OAuthService createService(OAuthConfig config)
|
||||||
{
|
{
|
||||||
return new OAuth20ServiceImpl(this, config);
|
return new OAuth20ServiceImpl(this, config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class DropBoxApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://api.dropbox.com/0/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return "https://www.dropbox.com/0/oauth/authorize?oauth_token="+requestToken.getToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://api.dropbox.com/0/oauth/request_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,11 +1,14 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
|
import static org.scribe.utils.URLUtils.*;
|
||||||
|
|
||||||
public class FacebookApi extends DefaultApi20
|
public class FacebookApi extends DefaultApi20
|
||||||
{
|
{
|
||||||
private static final String AUTHORIZE_URL = "https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s";
|
private static final String AUTHORIZE_URL = "https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s";
|
||||||
|
private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
@@ -17,6 +20,15 @@ public class FacebookApi extends DefaultApi20
|
|||||||
public String getAuthorizationUrl(OAuthConfig config)
|
public String getAuthorizationUrl(OAuthConfig config)
|
||||||
{
|
{
|
||||||
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Facebook does not support OOB");
|
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Facebook does not support OOB");
|
||||||
return String.format(AUTHORIZE_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()));
|
|
||||||
|
// Append scope if present
|
||||||
|
if(config.hasScope())
|
||||||
|
{
|
||||||
|
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()), formURLEncode(config.getScope()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.extractors.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
public class Foursquare2Api extends DefaultApi20
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "https://foursquare.com/oauth2/authenticate?client_id=%s&response_type=code&redirect_uri=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://foursquare.com/oauth2/access_token?grant_type=authorization_code";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(OAuthConfig config)
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Foursquare2 does not support OOB");
|
||||||
|
return String.format(AUTHORIZATION_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new JsonTokenExtractor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.extractors.*;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
import static org.scribe.utils.URLUtils.*;
|
||||||
|
|
||||||
|
public class LiveApi extends DefaultApi20
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final String AUTHORIZE_URL = "https://oauth.live.com/authorize?client_id=%s&redirect_uri=%s&response_type=code";
|
||||||
|
private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://oauth.live.com/token?grant_type=authorization_code";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(OAuthConfig config)
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Live does not support OOB");
|
||||||
|
|
||||||
|
// Append scope if present
|
||||||
|
if (config.hasScope())
|
||||||
|
{
|
||||||
|
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()), formURLEncode(config.getScope()));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new JsonTokenExtractor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
|
public class LoveFilmApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://openapi.lovefilm.com/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://openapi.lovefilm.com/oauth/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "https://www.lovefilm.com/activate?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class NeteaseWeibooApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://api.t.163.com/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://api.t.163.com/oauth/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "http://api.t.163.com/oauth/authorize?oauth_token=%s";
|
||||||
|
private static final String AUTHENTICATE_URL = "http://api.t.163.com/oauth/authenticate?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
/**
|
||||||
|
* this method will ignore your callback
|
||||||
|
* if you're creating a desktop client please choose this url
|
||||||
|
* else your can call getAuthenticateUrl
|
||||||
|
*
|
||||||
|
* via http://open.t.163.com/wiki/index.php?title=%E8%AF%B7%E6%B1%82%E7%94%A8%E6%88%B7%E6%8E%88%E6%9D%83Token(oauth/authorize)
|
||||||
|
*/
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this method is for web client with callback url
|
||||||
|
* if you're creating a desktop client please call getAuthorizationUrl
|
||||||
|
*
|
||||||
|
* via http://open.t.163.com/wiki/index.php?title=%E8%AF%B7%E6%B1%82%E7%94%A8%E6%88%B7%E6%8E%88%E6%9D%83Token(oauth/authenticate)
|
||||||
|
*/
|
||||||
|
public String getAuthenticateUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHENTICATE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
|
public class PlurkApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://www.plurk.com/OAuth/request_token";
|
||||||
|
private static final String AUTHORIZE_URL = "http://www.plurk.com/OAuth/authorize?oauth_token=%s";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://www.plurk.com/OAuth/access_token";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class SinaWeiboApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://api.t.sina.com.cn/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://api.t.sina.com.cn/oauth/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class SohuWeiboApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://api.t.sohu.com/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://api.t.sohu.com/oauth/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "http://api.t.sohu.com/oauth/authorize?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,17 +5,19 @@ import org.scribe.model.Token;
|
|||||||
public class TwitterApi extends DefaultApi10a
|
public class TwitterApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
private static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize?oauth_token=%s";
|
private static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize?oauth_token=%s";
|
||||||
|
private static final String REQUEST_TOKEN_RESOURCE = "api.twitter.com/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_RESOURCE = "api.twitter.com/oauth/access_token";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
{
|
{
|
||||||
return "http://api.twitter.com/oauth/access_token";
|
return "http://" + ACCESS_TOKEN_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRequestTokenEndpoint()
|
public String getRequestTokenEndpoint()
|
||||||
{
|
{
|
||||||
return "http://api.twitter.com/oauth/request_token";
|
return "http://" + REQUEST_TOKEN_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -23,4 +25,19 @@ public class TwitterApi extends DefaultApi10a
|
|||||||
{
|
{
|
||||||
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class SSL extends TwitterApi
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://" + ACCESS_TOKEN_RESOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://" + REQUEST_TOKEN_RESOURCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.extractors.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Boris G. Tsirkin <mail@dotbg.name>
|
||||||
|
* @since 20.4.2011
|
||||||
|
*/
|
||||||
|
public class VkontakteApi extends DefaultApi20
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZE_URL = "https://api.vkontakte.ru/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code";
|
||||||
|
private static final String SCOPED_AUTHORIZE_URL = String.format("%s&scope=%%s", AUTHORIZE_URL);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://api.vkontakte.ru/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(OAuthConfig config)
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl(config.getCallback(), "Valid url is required for a callback. Vkontakte does not support OOB");
|
||||||
|
if(config.hasScope())// Appending scope if present
|
||||||
|
{
|
||||||
|
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()),URLUtils.formURLEncode(config.getScope()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new JsonTokenExtractor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
import org.scribe.model.Token;
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.services.*;
|
||||||
|
|
||||||
public class YammerApi extends DefaultApi10a
|
public class YammerApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
@@ -23,4 +24,10 @@ public class YammerApi extends DefaultApi10a
|
|||||||
{
|
{
|
||||||
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SignatureService getSignatureService()
|
||||||
|
{
|
||||||
|
return new PlaintextSignatureService();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ public class BaseStringExtractorImpl implements BaseStringExtractor
|
|||||||
MapUtils.decodeAndAppendEntries(request.getBodyParams(), params);
|
MapUtils.decodeAndAppendEntries(request.getBodyParams(), params);
|
||||||
MapUtils.decodeAndAppendEntries(request.getOauthParameters(), params);
|
MapUtils.decodeAndAppendEntries(request.getOauthParameters(), params);
|
||||||
params = MapUtils.sort(params);
|
params = MapUtils.sort(params);
|
||||||
return URLUtils.percentEncode(URLUtils.concatSortedPercentEncodedParams(params));
|
return URLUtils.percentEncode(MapUtils.concatSortedPercentEncodedParams(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPreconditions(OAuthRequest request)
|
private void checkPreconditions(OAuthRequest request)
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.extractors;
|
||||||
|
|
||||||
|
import java.util.regex.*;
|
||||||
|
|
||||||
|
import org.scribe.exceptions.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
public class JsonTokenExtractor implements AccessTokenExtractor
|
||||||
|
{
|
||||||
|
private Pattern accessTokenPattern = Pattern.compile("\"access_token\":\"(\\S*?)\"");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token extract(String response)
|
||||||
|
{
|
||||||
|
Preconditions.checkEmptyString(response, "Cannot extract a token from a null or empty String");
|
||||||
|
Matcher matcher = accessTokenPattern.matcher(response);
|
||||||
|
if(matcher.find())
|
||||||
|
{
|
||||||
|
return new Token(matcher.group(1), "", response);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new OAuthException("Cannot extract an acces token. Response was: " + response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ public class TokenExtractor20Impl implements AccessTokenExtractor
|
|||||||
if (matcher.matches())
|
if (matcher.matches())
|
||||||
{
|
{
|
||||||
String token = URLUtils.formURLDecode(matcher.group(1));
|
String token = URLUtils.formURLDecode(matcher.group(1));
|
||||||
return new Token(token, EMPTY_SECRET);
|
return new Token(token, EMPTY_SECRET, response);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ import org.scribe.utils.*;
|
|||||||
*/
|
*/
|
||||||
public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExtractor
|
public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExtractor
|
||||||
{
|
{
|
||||||
private static final String TOKEN_REGEX = "oauth_token=(\\S*)&oauth_token_secret=(\\S*?)(&(.*))?";
|
private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)");
|
||||||
|
private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]+)");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
@@ -23,17 +24,21 @@ public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExt
|
|||||||
public Token extract(String response)
|
public Token extract(String response)
|
||||||
{
|
{
|
||||||
Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string");
|
Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string");
|
||||||
|
String token = extract(response, TOKEN_REGEX);
|
||||||
|
String secret = extract(response, SECRET_REGEX);
|
||||||
|
return new Token(token, secret, response);
|
||||||
|
}
|
||||||
|
|
||||||
Matcher matcher = Pattern.compile(TOKEN_REGEX).matcher(response);
|
private String extract(String response, Pattern p)
|
||||||
if (matcher.matches())
|
|
||||||
{
|
{
|
||||||
String token = URLUtils.formURLDecode(matcher.group(1));
|
Matcher matcher = p.matcher(response);
|
||||||
String secret = URLUtils.formURLDecode(matcher.group(2));
|
if (matcher.find() && matcher.groupCount() >= 1)
|
||||||
return new Token(token, secret);
|
{
|
||||||
|
return URLUtils.formURLDecode(matcher.group(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null);
|
throw new OAuthException("Response body is incorrect. Can't extract token and secret from this: '" + response + "'", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,20 +7,24 @@ package org.scribe.model;
|
|||||||
*/
|
*/
|
||||||
public class OAuthConfig
|
public class OAuthConfig
|
||||||
{
|
{
|
||||||
private String apiKey;
|
private final String apiKey;
|
||||||
private String apiSecret;
|
private final String apiSecret;
|
||||||
private String callback;
|
private final String callback;
|
||||||
|
private final SignatureType signatureType;
|
||||||
|
private final String scope;
|
||||||
|
|
||||||
public OAuthConfig(String key, String secret)
|
public OAuthConfig(String key, String secret)
|
||||||
{
|
{
|
||||||
this(key,secret,null);
|
this(key, secret, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OAuthConfig(String key, String secret, String callback)
|
public OAuthConfig(String key, String secret, String callback, SignatureType type, String scope)
|
||||||
{
|
{
|
||||||
this.apiKey = key;
|
this.apiKey = key;
|
||||||
this.apiSecret = secret;
|
this.apiSecret = secret;
|
||||||
this.callback = callback;
|
this.callback = callback != null ? callback : OAuthConstants.OUT_OF_BAND;
|
||||||
|
this.signatureType = (type != null) ? type : SignatureType.Header;
|
||||||
|
this.scope = scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getApiKey()
|
public String getApiKey()
|
||||||
@@ -28,28 +32,28 @@ public class OAuthConfig
|
|||||||
return apiKey;
|
return apiKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setApiKey(String apiKey)
|
|
||||||
{
|
|
||||||
this.apiKey = apiKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getApiSecret()
|
public String getApiSecret()
|
||||||
{
|
{
|
||||||
return apiSecret;
|
return apiSecret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setApiSecret(String apiSecret)
|
|
||||||
{
|
|
||||||
this.apiSecret = apiSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCallback()
|
public String getCallback()
|
||||||
{
|
{
|
||||||
return callback != null ? callback : OAuthConstants.OUT_OF_BAND;
|
return callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCallback(String callback)
|
public SignatureType getSignatureType()
|
||||||
{
|
{
|
||||||
this.callback = callback;
|
return signatureType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getScope()
|
||||||
|
{
|
||||||
|
return scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasScope()
|
||||||
|
{
|
||||||
|
return scope != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ package org.scribe.model;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
import java.nio.charset.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -24,6 +25,11 @@ class Request
|
|||||||
private Map<String, String> headers;
|
private Map<String, String> headers;
|
||||||
private String payload = null;
|
private String payload = null;
|
||||||
private HttpURLConnection connection;
|
private HttpURLConnection connection;
|
||||||
|
private String charset;
|
||||||
|
private byte[] bytePayload = null;
|
||||||
|
private boolean connectionKeepAlive = false;
|
||||||
|
private Long connectTimeout = null;
|
||||||
|
private Long readTimeout = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Http Request
|
* Creates a new Http Request
|
||||||
@@ -64,6 +70,7 @@ class Request
|
|||||||
String effectiveUrl = URLUtils.appendParametersToQueryString(url, querystringParams);
|
String effectiveUrl = URLUtils.appendParametersToQueryString(url, querystringParams);
|
||||||
if (connection == null)
|
if (connection == null)
|
||||||
{
|
{
|
||||||
|
System.setProperty("http.keepAlive", connectionKeepAlive ? "true" : "false");
|
||||||
connection = (HttpURLConnection) new URL(effectiveUrl).openConnection();
|
connection = (HttpURLConnection) new URL(effectiveUrl).openConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,10 +78,18 @@ class Request
|
|||||||
Response doSend() throws IOException
|
Response doSend() throws IOException
|
||||||
{
|
{
|
||||||
connection.setRequestMethod(this.verb.name());
|
connection.setRequestMethod(this.verb.name());
|
||||||
|
if (connectTimeout != null)
|
||||||
|
{
|
||||||
|
connection.setConnectTimeout(connectTimeout.intValue());
|
||||||
|
}
|
||||||
|
if (readTimeout != null)
|
||||||
|
{
|
||||||
|
connection.setReadTimeout(readTimeout.intValue());
|
||||||
|
}
|
||||||
addHeaders(connection);
|
addHeaders(connection);
|
||||||
if (verb.equals(Verb.PUT) || verb.equals(Verb.POST))
|
if (verb.equals(Verb.PUT) || verb.equals(Verb.POST))
|
||||||
{
|
{
|
||||||
addBody(connection, getBodyContents());
|
addBody(connection, getByteBodyContents());
|
||||||
}
|
}
|
||||||
return new Response(connection);
|
return new Response(connection);
|
||||||
}
|
}
|
||||||
@@ -85,11 +100,11 @@ class Request
|
|||||||
conn.setRequestProperty(key, headers.get(key));
|
conn.setRequestProperty(key, headers.get(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
void addBody(HttpURLConnection conn, String content) throws IOException
|
void addBody(HttpURLConnection conn, byte[] content) throws IOException
|
||||||
{
|
{
|
||||||
conn.setRequestProperty(CONTENT_LENGTH, String.valueOf(content.getBytes().length));
|
conn.setRequestProperty(CONTENT_LENGTH, String.valueOf(content.length));
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
conn.getOutputStream().write(content.getBytes());
|
conn.getOutputStream().write(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -140,6 +155,16 @@ class Request
|
|||||||
this.payload = payload;
|
this.payload = payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overloaded version for byte arrays
|
||||||
|
*
|
||||||
|
* @param payload
|
||||||
|
*/
|
||||||
|
public void addPayload(byte[] payload)
|
||||||
|
{
|
||||||
|
this.bytePayload = payload;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a {@link Map} of the query string parameters.
|
* Get a {@link Map} of the query string parameters.
|
||||||
*
|
*
|
||||||
@@ -152,7 +177,7 @@ class Request
|
|||||||
{
|
{
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
String queryString = new URL(url).getQuery();
|
String queryString = new URL(url).getQuery();
|
||||||
params.putAll(URLUtils.queryStringToMap(queryString));
|
params.putAll(MapUtils.queryStringToMap(queryString));
|
||||||
params.putAll(this.querystringParams);
|
params.putAll(this.querystringParams);
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
@@ -196,10 +221,32 @@ class Request
|
|||||||
* Returns the body of the request
|
* Returns the body of the request
|
||||||
*
|
*
|
||||||
* @return form encoded string
|
* @return form encoded string
|
||||||
|
* @throws OAuthException if the charset chosen is not supported
|
||||||
*/
|
*/
|
||||||
public String getBodyContents()
|
public String getBodyContents()
|
||||||
{
|
{
|
||||||
return (payload != null) ? payload : URLUtils.formURLEncodeMap(bodyParams);
|
try
|
||||||
|
{
|
||||||
|
return new String(getByteBodyContents(),getCharset());
|
||||||
|
}
|
||||||
|
catch(UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Unsupported Charset: "+charset, uee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] getByteBodyContents()
|
||||||
|
{
|
||||||
|
if (bytePayload != null) return bytePayload;
|
||||||
|
String body = (payload != null) ? payload : URLUtils.formURLEncodeMap(bodyParams);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return body.getBytes(getCharset());
|
||||||
|
}
|
||||||
|
catch(UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Unsupported Charset: "+getCharset(), uee);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -222,6 +269,16 @@ class Request
|
|||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the connection charset. Defaults to {@link Charset} defaultCharset if not set
|
||||||
|
*
|
||||||
|
* @return charset
|
||||||
|
*/
|
||||||
|
public String getCharset()
|
||||||
|
{
|
||||||
|
return charset == null ? Charset.defaultCharset().name() : charset;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the connect timeout for the underlying {@link HttpURLConnection}
|
* Sets the connect timeout for the underlying {@link HttpURLConnection}
|
||||||
*
|
*
|
||||||
@@ -231,7 +288,7 @@ class Request
|
|||||||
*/
|
*/
|
||||||
public void setConnectTimeout(int duration, TimeUnit unit)
|
public void setConnectTimeout(int duration, TimeUnit unit)
|
||||||
{
|
{
|
||||||
this.connection.setConnectTimeout((int) unit.toMillis(duration));
|
this.connectTimeout = unit.toMillis(duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -243,7 +300,28 @@ class Request
|
|||||||
*/
|
*/
|
||||||
public void setReadTimeout(int duration, TimeUnit unit)
|
public void setReadTimeout(int duration, TimeUnit unit)
|
||||||
{
|
{
|
||||||
this.connection.setReadTimeout((int) unit.toMillis(duration));
|
this.readTimeout = unit.toMillis(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the charset of the body of the request
|
||||||
|
*
|
||||||
|
* @param charsetName name of the charset of the request
|
||||||
|
*/
|
||||||
|
public void setCharset(String charsetName)
|
||||||
|
{
|
||||||
|
this.charset = charsetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets wether the underlying Http Connection is persistent or not.
|
||||||
|
*
|
||||||
|
* @see http://download.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html
|
||||||
|
* @param connectionKeepAlive
|
||||||
|
*/
|
||||||
|
public void setConnectionKeepAlive(boolean connectionKeepAlive)
|
||||||
|
{
|
||||||
|
this.connectionKeepAlive = connectionKeepAlive;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.scribe.model;
|
||||||
|
|
||||||
|
public enum SignatureType
|
||||||
|
{
|
||||||
|
Header,
|
||||||
|
QueryString
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ public class Token implements Serializable
|
|||||||
|
|
||||||
private final String token;
|
private final String token;
|
||||||
private final String secret;
|
private final String secret;
|
||||||
|
private final String rawResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
@@ -21,9 +22,15 @@ public class Token implements Serializable
|
|||||||
* @param secret token secret
|
* @param secret token secret
|
||||||
*/
|
*/
|
||||||
public Token(String token, String secret)
|
public Token(String token, String secret)
|
||||||
|
{
|
||||||
|
this(token, secret, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Token(String token, String secret, String rawResponse)
|
||||||
{
|
{
|
||||||
this.token = token;
|
this.token = token;
|
||||||
this.secret = secret;
|
this.secret = secret;
|
||||||
|
this.rawResponse = rawResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getToken()
|
public String getToken()
|
||||||
@@ -36,6 +43,15 @@ public class Token implements Serializable
|
|||||||
return secret;
|
return secret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getRawResponse()
|
||||||
|
{
|
||||||
|
if (rawResponse == null)
|
||||||
|
{
|
||||||
|
throw new IllegalStateException("This token object was not constructed by scribe and does not have a rawResponse");
|
||||||
|
}
|
||||||
|
return rawResponse;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.scribe.oauth;
|
package org.scribe.oauth;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import org.scribe.builder.api.*;
|
import org.scribe.builder.api.*;
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
@@ -10,12 +12,10 @@ import org.scribe.model.*;
|
|||||||
*/
|
*/
|
||||||
public class OAuth10aServiceImpl implements OAuthService
|
public class OAuth10aServiceImpl implements OAuthService
|
||||||
{
|
{
|
||||||
private static final String NO_SCOPE = null;
|
|
||||||
private static final String VERSION = "1.0";
|
private static final String VERSION = "1.0";
|
||||||
|
|
||||||
private OAuthConfig config;
|
private OAuthConfig config;
|
||||||
private DefaultApi10a api;
|
private DefaultApi10a api;
|
||||||
private String scope;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
@@ -27,7 +27,6 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
{
|
{
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.scope = NO_SCOPE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,7 +37,7 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
|
OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
|
||||||
request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback());
|
request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback());
|
||||||
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
|
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
|
||||||
addOAuthHeader(request);
|
addSignature(request);
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
return api.getRequestTokenExtractor().extract(response.getBody());
|
return api.getRequestTokenExtractor().extract(response.getBody());
|
||||||
}
|
}
|
||||||
@@ -50,7 +49,7 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
request.addOAuthParameter(OAuthConstants.CONSUMER_KEY, config.getApiKey());
|
request.addOAuthParameter(OAuthConstants.CONSUMER_KEY, config.getApiKey());
|
||||||
request.addOAuthParameter(OAuthConstants.SIGN_METHOD, api.getSignatureService().getSignatureMethod());
|
request.addOAuthParameter(OAuthConstants.SIGN_METHOD, api.getSignatureService().getSignatureMethod());
|
||||||
request.addOAuthParameter(OAuthConstants.VERSION, getVersion());
|
request.addOAuthParameter(OAuthConstants.VERSION, getVersion());
|
||||||
if(scope != NO_SCOPE) request.addOAuthParameter(OAuthConstants.SCOPE, scope);
|
if(config.hasScope()) request.addOAuthParameter(OAuthConstants.SCOPE, config.getScope());
|
||||||
request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token));
|
request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
|
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
|
||||||
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
|
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
|
||||||
addOAuthParams(request, requestToken);
|
addOAuthParams(request, requestToken);
|
||||||
addOAuthHeader(request);
|
addSignature(request);
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
return api.getAccessTokenExtractor().extract(response.getBody());
|
return api.getAccessTokenExtractor().extract(response.getBody());
|
||||||
}
|
}
|
||||||
@@ -75,7 +74,7 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
{
|
{
|
||||||
request.addOAuthParameter(OAuthConstants.TOKEN, token.getToken());
|
request.addOAuthParameter(OAuthConstants.TOKEN, token.getToken());
|
||||||
addOAuthParams(request, token);
|
addOAuthParams(request, token);
|
||||||
addOAuthHeader(request);
|
addSignature(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,14 +85,6 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
return VERSION;
|
return VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void addScope(String scope)
|
|
||||||
{
|
|
||||||
this.scope = scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@@ -108,9 +99,20 @@ public class OAuth10aServiceImpl implements OAuthService
|
|||||||
return api.getSignatureService().getSignature(baseString, config.getApiSecret(), token.getSecret());
|
return api.getSignatureService().getSignature(baseString, config.getApiSecret(), token.getSecret());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addOAuthHeader(OAuthRequest request)
|
private void addSignature(OAuthRequest request)
|
||||||
{
|
{
|
||||||
|
switch (config.getSignatureType())
|
||||||
|
{
|
||||||
|
case Header:
|
||||||
String oauthHeader = api.getHeaderExtractor().extract(request);
|
String oauthHeader = api.getHeaderExtractor().extract(request);
|
||||||
request.addHeader(OAuthConstants.HEADER, oauthHeader);
|
request.addHeader(OAuthConstants.HEADER, oauthHeader);
|
||||||
|
break;
|
||||||
|
case QueryString:
|
||||||
|
for (Map.Entry<String, String> entry : request.getOauthParameters().entrySet())
|
||||||
|
{
|
||||||
|
request.addQuerystringParameter(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,14 +22,6 @@ public class OAuth20ServiceImpl implements OAuthService
|
|||||||
this.config = config;
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void addScope(String scope)
|
|
||||||
{
|
|
||||||
throw new UnsupportedOperationException("OAuth 2 does not use scopes");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@@ -40,6 +32,7 @@ public class OAuth20ServiceImpl implements OAuthService
|
|||||||
request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
|
request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
|
||||||
request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
|
request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
|
||||||
request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
|
request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
|
||||||
|
if(config.hasScope()) request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope());
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
return api.getAccessTokenExtractor().extract(response.getBody());
|
return api.getAccessTokenExtractor().extract(response.getBody());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,13 +42,6 @@ public interface OAuthService
|
|||||||
*/
|
*/
|
||||||
public String getVersion();
|
public String getVersion();
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the 'scope' parameter. This is **not** a default OAuth parameter and the setting is optional.
|
|
||||||
*
|
|
||||||
* @param scope OAuth Api scope (optional)
|
|
||||||
*/
|
|
||||||
public void addScope(String scope);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the URL where you should redirect your users to authenticate
|
* Returns the URL where you should redirect your users to authenticate
|
||||||
* your application.
|
* your application.
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.scribe.services;
|
||||||
|
|
||||||
|
import org.scribe.exceptions.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* plaintext implementation of {@SignatureService}
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PlaintextSignatureService implements SignatureService
|
||||||
|
{
|
||||||
|
private static final String METHOD = "plaintext";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getSignature(String baseString, String apiSecret, String tokenSecret)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Preconditions.checkEmptyString(apiSecret, "Api secret cant be null or empty string");
|
||||||
|
return URLUtils.percentEncode(apiSecret) + '&' + URLUtils.percentEncode(tokenSecret);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new OAuthSignatureException(baseString, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getSignatureMethod()
|
||||||
|
{
|
||||||
|
return METHOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -9,6 +9,10 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class MapUtils
|
public class MapUtils
|
||||||
{
|
{
|
||||||
|
private static final String EMPTY_STRING = "";
|
||||||
|
private static final String PAIR_SEPARATOR = "=";
|
||||||
|
private static final String PARAM_SEPARATOR = "&";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts a Map
|
* Sorts a Map
|
||||||
*
|
*
|
||||||
@@ -48,4 +52,43 @@ public class MapUtils
|
|||||||
target.put(URLUtils.percentEncode(key), URLUtils.percentEncode(source.get(key)));
|
target.put(URLUtils.percentEncode(key), URLUtils.percentEncode(source.get(key)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concats a key-value map into a querystring-like String
|
||||||
|
*
|
||||||
|
* @param params key-value map
|
||||||
|
* @return querystring-like String
|
||||||
|
*/
|
||||||
|
public static String concatSortedPercentEncodedParams(Map<String, String> params)
|
||||||
|
{
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
for (String key : params.keySet())
|
||||||
|
{
|
||||||
|
result.append(key).append(PAIR_SEPARATOR);
|
||||||
|
result.append(params.get(key)).append(PARAM_SEPARATOR);
|
||||||
|
}
|
||||||
|
return result.toString().substring(0, result.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses and form-urldecodes a querystring-like string into a map
|
||||||
|
*
|
||||||
|
* @param queryString querystring-like String
|
||||||
|
* @return a map with the form-urldecoded parameters
|
||||||
|
*/
|
||||||
|
public static Map<String, String> queryStringToMap(String queryString)
|
||||||
|
{
|
||||||
|
Map<String, String> result = new HashMap<String, String>();
|
||||||
|
if (queryString != null && queryString.length() > 0)
|
||||||
|
{
|
||||||
|
for (String param : queryString.split(PARAM_SEPARATOR))
|
||||||
|
{
|
||||||
|
String pair[] = param.split(PAIR_SEPARATOR);
|
||||||
|
String key = URLUtils.formURLDecode(pair[0]);
|
||||||
|
String value = pair.length > 1 ? URLUtils.formURLDecode(pair[1]) : EMPTY_STRING;
|
||||||
|
result.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -133,47 +133,6 @@ public class URLUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Concats a key-value map into a querystring-like String
|
|
||||||
*
|
|
||||||
* @param params key-value map
|
|
||||||
* @return querystring-like String
|
|
||||||
*/
|
|
||||||
// TODO Move to MapUtils
|
|
||||||
public static String concatSortedPercentEncodedParams(Map<String, String> params)
|
|
||||||
{
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
for (String key : params.keySet())
|
|
||||||
{
|
|
||||||
result.append(key).append(PAIR_SEPARATOR);
|
|
||||||
result.append(params.get(key)).append(PARAM_SEPARATOR);
|
|
||||||
}
|
|
||||||
return result.toString().substring(0, result.length() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses and form-urldecodes a querystring-like string into a map
|
|
||||||
*
|
|
||||||
* @param queryString querystring-like String
|
|
||||||
* @return a map with the form-urldecoded parameters
|
|
||||||
*/
|
|
||||||
// TODO Move to MapUtils
|
|
||||||
public static Map<String, String> queryStringToMap(String queryString)
|
|
||||||
{
|
|
||||||
Map<String, String> result = new HashMap<String, String>();
|
|
||||||
if (queryString != null && queryString.length() > 0)
|
|
||||||
{
|
|
||||||
for (String param : queryString.split(PARAM_SEPARATOR))
|
|
||||||
{
|
|
||||||
String pair[] = param.split(PAIR_SEPARATOR);
|
|
||||||
String key = formURLDecode(pair[0]);
|
|
||||||
String value = pair.length > 1 ? formURLDecode(pair[1]) : EMPTY_STRING;
|
|
||||||
result.put(key, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class EncodingRule
|
private static final class EncodingRule
|
||||||
{
|
{
|
||||||
private final String ch;
|
private final String ch;
|
||||||
|
|||||||
@@ -18,12 +18,13 @@ public class ServiceBuilderTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReturnOOBasDefaultCallback()
|
public void shouldReturnConfigDefaultValues()
|
||||||
{
|
{
|
||||||
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").build();
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").build();
|
||||||
assertEquals(ApiMock.config.getApiKey(), "key");
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
assertEquals(ApiMock.config.getCallback(), OAuthConstants.OUT_OF_BAND);
|
assertEquals(ApiMock.config.getCallback(), OAuthConstants.OUT_OF_BAND);
|
||||||
|
assertEquals(ApiMock.config.getSignatureType(), SignatureType.Header);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -35,6 +36,15 @@ public class ServiceBuilderTest
|
|||||||
assertEquals(ApiMock.config.getCallback(), "http://example.com");
|
assertEquals(ApiMock.config.getCallback(), "http://example.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAcceptASignatureType()
|
||||||
|
{
|
||||||
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").signatureType(SignatureType.QueryString).build();
|
||||||
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
|
assertEquals(ApiMock.config.getSignatureType(), SignatureType.QueryString);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expected=IllegalArgumentException.class)
|
@Test(expected=IllegalArgumentException.class)
|
||||||
public void shouldNotAcceptAnInvalidUrlAsCallback()
|
public void shouldNotAcceptAnInvalidUrlAsCallback()
|
||||||
{
|
{
|
||||||
@@ -47,19 +57,17 @@ public class ServiceBuilderTest
|
|||||||
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").scope("rss-api").build();
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").scope("rss-api").build();
|
||||||
assertEquals(ApiMock.config.getApiKey(), "key");
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
assertEquals(ApiMock.scope, "rss-api");
|
assertEquals(ApiMock.config.getScope(), "rss-api");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ApiMock implements Api
|
public static class ApiMock implements Api
|
||||||
{
|
{
|
||||||
public static OAuthConfig config;
|
public static OAuthConfig config;
|
||||||
public static String scope;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OAuthService createService(OAuthConfig config, String scope)
|
public OAuthService createService(OAuthConfig config)
|
||||||
{
|
{
|
||||||
ApiMock.config = config;
|
ApiMock.config = config;
|
||||||
ApiMock.scope = scope;
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class Foursquare2Example
|
||||||
|
{
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://api.foursquare.com/v2/users/self/friends?oauth_token=";
|
||||||
|
private static final Token EMPTY_TOKEN = null;
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "FEGFXJUFANVVDHVSNUAMUKTTXCP1AJQD53E33XKJ44YP1S4I";
|
||||||
|
String apiSecret = "AYWKUL5SWPNC0CTQ202QXRUG2NLZYXMRA34ZSDW4AUYBG2RC";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(Foursquare2Api.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.callback("http://localhost:9000/")
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== Foursquare2's OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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(EMPTY_TOKEN, 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 + accessToken.getToken());
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class LiveExample
|
||||||
|
{
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://api.foursquare.com/v2/users/self/friends?oauth_token=";
|
||||||
|
private static final Token EMPTY_TOKEN = null;
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "";
|
||||||
|
String apiSecret = "";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(LiveApi.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.scope("wl.basic")
|
||||||
|
.callback("http://localhost:9000/")
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== Windows Live's OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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(EMPTY_TOKEN, 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 + accessToken.getToken());
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class LoveFilmExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "LoveFilm";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://api.lovefilm.com/users";
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "your_key";
|
||||||
|
String apiSecret = "your_secret";
|
||||||
|
OAuthService service = new ServiceBuilder().provider(LoveFilmApi.class).apiKey(apiKey).apiSecret(apiSecret).build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Grab a request token.
|
||||||
|
System.out.println("Fetching request token.");
|
||||||
|
Token requestToken = service.getRequestToken();
|
||||||
|
System.out.println("Got it ... ");
|
||||||
|
System.out.println(requestToken.getToken());
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(requestToken);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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.GET, PROTECTED_RESOURCE_URL);
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class NeteaseWeiboExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "NetEase(163.com) Weibo";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "http://api.t.163.com/account/verify_credentials.json";
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "your key";
|
||||||
|
String apiSecret = "your secret";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(NeteaseWeibooApi.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Grab a request token.
|
||||||
|
System.out.println("Fetching request token.");
|
||||||
|
Token requestToken = service.getRequestToken();
|
||||||
|
System.out.println("Got it ... ");
|
||||||
|
System.out.println(requestToken.getToken());
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(requestToken);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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.GET, PROTECTED_RESOURCE_URL);
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class SinaWeiboExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "SinaWeibo";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "http://api.t.sina.com.cn/account/verify_credentials.json";
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "your key";
|
||||||
|
String apiSecret = "your secret";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(SinaWeiboApi.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Grab a request token.
|
||||||
|
System.out.println("Fetching request token.");
|
||||||
|
Token requestToken = service.getRequestToken();
|
||||||
|
System.out.println("Got it ... ");
|
||||||
|
System.out.println(requestToken.getToken());
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(requestToken);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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.GET, PROTECTED_RESOURCE_URL);
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class SohuWeiboExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "SohuWeibo";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "http://api.t.sohu.com/account/verify_credentials.json";
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
String apiKey = "your_key";
|
||||||
|
String apiSecret = "your_secret";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(SohuWeiboApi.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Grab a request token.
|
||||||
|
System.out.println("Fetching request token.");
|
||||||
|
Token requestToken = service.getRequestToken();
|
||||||
|
System.out.println("Got it ... ");
|
||||||
|
System.out.println(requestToken.getToken());
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(requestToken);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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.GET, PROTECTED_RESOURCE_URL);
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.scribe.examples;
|
||||||
|
|
||||||
|
import org.scribe.builder.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Boris G. Tsirkin <mail@dotbg.name>
|
||||||
|
* @since 20.4.2011
|
||||||
|
*/
|
||||||
|
public class VkontakteExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "Vkontakte.ru";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://api.vkontakte.ru/method/friends.get";
|
||||||
|
private static final Token EMPTY_TOKEN = null;
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
// Replace these with your own api key and secret
|
||||||
|
final String clientId = "your app id";
|
||||||
|
final String apiSecret = "your api secret";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(VkontakteApi.class)
|
||||||
|
.apiKey(clientId)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.scope("friends,wall,offline") // replace with desired scope
|
||||||
|
.callback("http://your.site.com/callback")
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Obtain the Authorization URL
|
||||||
|
System.out.println("Fetching the Authorization URL...");
|
||||||
|
String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
|
||||||
|
System.out.println("Got the Authorization URL!");
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(authorizationUrl);
|
||||||
|
System.out.println("And paste the authorization code 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(EMPTY_TOKEN, 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);
|
||||||
|
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.getCode());
|
||||||
|
System.out.println(response.getBody());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package org.scribe.extractors;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class JsonTokenExtractorTest
|
||||||
|
{
|
||||||
|
private String response = "'{ \"access_token\":\"I0122HHJKLEM21F3WLPYHDKGKZULAUO4SGMV3ABKFTDT3T3X\"}'";
|
||||||
|
private JsonTokenExtractor extractor = new JsonTokenExtractor();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldParseResponse()
|
||||||
|
{
|
||||||
|
Token token = extractor.extract(response);
|
||||||
|
assertEquals(token.getToken(), "I0122HHJKLEM21F3WLPYHDKGKZULAUO4SGMV3ABKFTDT3T3X");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfForNullParameters()
|
||||||
|
{
|
||||||
|
extractor.extract(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfForEmptyStrings()
|
||||||
|
{
|
||||||
|
extractor.extract("");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,6 +26,15 @@ public class TokenExtractorTest
|
|||||||
assertEquals("hdhd0244k9j7ao03", extracted.getSecret());
|
assertEquals("hdhd0244k9j7ao03", extracted.getSecret());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExtractTokenFromInvertedOAuthStandardResponse()
|
||||||
|
{
|
||||||
|
String response = "oauth_token_secret=hh5s93j4hdidpola&oauth_token=hdhd0244k9j7ao03";
|
||||||
|
Token extracted = extractor.extract(response);
|
||||||
|
assertEquals("hh5s93j4hdidpola", extracted.getSecret());
|
||||||
|
assertEquals("hdhd0244k9j7ao03", extracted.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldExtractTokenFromResponseWithCallbackConfirmed()
|
public void shouldExtractTokenFromResponseWithCallbackConfirmed()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,12 +12,14 @@ public class OAuthConfigTest
|
|||||||
{
|
{
|
||||||
OAuthConfig config = new OAuthConfig("key", "secret");
|
OAuthConfig config = new OAuthConfig("key", "secret");
|
||||||
assertEquals(OAuthConstants.OUT_OF_BAND, config.getCallback());
|
assertEquals(OAuthConstants.OUT_OF_BAND, config.getCallback());
|
||||||
|
assertEquals(SignatureType.Header, config.getSignatureType());
|
||||||
|
assertFalse(config.hasScope());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldOverrideDefaultsIfSet()
|
public void shouldOverrideDefaultsIfSet()
|
||||||
{
|
{
|
||||||
OAuthConfig config = new OAuthConfig("key", "secret", "http://callback");
|
OAuthConfig config = new OAuthConfig("key", "secret", "http://callback", SignatureType.Header, "scope");
|
||||||
assertEquals("http://callback", config.getCallback());
|
assertEquals("http://callback", config.getCallback());
|
||||||
assertEquals("key", config.getApiKey());
|
assertEquals("key", config.getApiKey());
|
||||||
assertEquals("secret", config.getApiSecret());
|
assertEquals("secret", config.getApiSecret());
|
||||||
|
|||||||
Reference in new issue
Block a user