Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a63f935d2 | ||
|
|
61c0b4cc9f | ||
|
|
3f366589ea | ||
|
|
83b62f6079 | ||
|
|
b380b3af3d | ||
|
|
ce531cdc38 | ||
|
|
56561acdac | ||
|
|
05988a63cd | ||
|
|
611c6464f2 | ||
|
|
7fba153218 | ||
|
|
9070edd20a | ||
|
|
78fd342d92 | ||
|
|
7510111d28 | ||
|
|
852368e0a7 | ||
|
|
dbf00c9227 | ||
|
|
ce139bb28b | ||
|
|
40c8a27bb0 | ||
|
|
ae3a1b11c9 | ||
|
|
24babbae02 | ||
|
|
9f4569fbbc | ||
|
|
7e7d3ff7e0 | ||
|
|
dcd13835ba | ||
|
|
daf45d7078 | ||
|
|
8a7336b7d4 | ||
|
|
207df8a3d4 | ||
|
|
4f8315f7f7 | ||
|
|
e719c73d92 | ||
|
|
c6bff31353 | ||
|
|
27b1fc390b | ||
|
|
b917140078 | ||
|
|
9cdebd1ca6 | ||
|
|
2238c2da51 | ||
|
|
bf9a4bac68 | ||
|
|
d8e384f9c7 | ||
|
|
35ca23f442 | ||
|
|
93602c4120 | ||
|
|
62b43855c2 | ||
|
|
a62fa36da0 | ||
|
|
0390ae7eb7 | ||
|
|
1d59fbd014 | ||
|
|
79fa710e47 | ||
|
|
079ce6a2c2 | ||
|
|
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 | ||
|
|
72901165f8 | ||
|
|
4f23cfaf20 | ||
|
|
5c0d150547 | ||
|
|
6bdae4999e | ||
|
|
c441b7d8a4 | ||
|
|
d8ab4ba404 | ||
|
|
6923d3311f | ||
|
|
0832613b60 | ||
|
|
73a53b363a | ||
|
|
16b3475926 | ||
|
|
22367de553 | ||
|
|
906a979e63 | ||
|
|
bb872e4466 | ||
|
|
d19c5d6e35 | ||
|
|
e0e8df98d3 | ||
|
|
de8f0d621d | ||
|
|
db37744fa3 | ||
|
|
02f3d4dac2 | ||
|
|
7385d3702e | ||
|
|
581e2b6d84 | ||
|
|
08aebb5fb1 | ||
|
|
c7176c97e2 | ||
|
|
70358ad651 | ||
|
|
0f39d37ddc | ||
|
|
da3a3f4a0d | ||
|
|
380d858b13 | ||
|
|
9c4f5bc337 | ||
|
|
09ee10dbd1 | ||
|
|
690b9d4e21 | ||
|
|
080dd962a9 | ||
|
|
40bb525374 | ||
|
|
8e23e81c57 | ||
|
|
1f055d7eeb | ||
|
|
1f36fd0f32 | ||
|
|
9ea686a3f8 | ||
|
|
7e92db3413 | ||
|
|
f6c3cb9bdb | ||
|
|
088fc5e443 | ||
|
|
27bac50073 | ||
|
|
6fc5146706 | ||
|
|
0e5ae92d3e | ||
|
|
c145ee8842 | ||
|
|
bdfd14309f | ||
|
|
82f03604c3 | ||
|
|
5ac849313d | ||
|
|
c12da16a38 | ||
|
|
b78ca90df4 | ||
|
|
577c18c752 | ||
|
|
41cbee06d7 | ||
|
|
8eb2062e95 | ||
|
|
8f0760664f | ||
|
|
0be82d6832 | ||
|
|
d0fa8689cb | ||
|
|
896e738156 | ||
|
|
cf84381127 | ||
|
|
806d548629 | ||
|
|
959c093620 | ||
|
|
fc2c46bd3a | ||
|
|
f1ecabdb52 | ||
|
|
83f17b0652 | ||
|
|
ebe0ff9eda | ||
|
|
6e141ba6a2 | ||
|
|
23af69cbf8 | ||
|
|
c0d24b556c | ||
|
|
99a03b4679 | ||
|
|
9337ac01d9 | ||
|
|
dee0f55b1e | ||
|
|
377c3233d9 | ||
|
|
029125490d | ||
|
|
20b200c7bc | ||
|
|
3e7291eaee | ||
|
|
149756e5ed | ||
|
|
9cb2af37c7 | ||
|
|
ed0970c8cb | ||
|
|
58991e81ef | ||
|
|
db27be9e2b | ||
|
|
874e959e09 | ||
|
|
545867ca1d | ||
|
|
8bd1e94287 | ||
|
|
843d9feddc | ||
|
|
9b85863edf | ||
|
|
59f16bfdda | ||
|
|
aad8dac580 | ||
|
|
50b54fbfb6 | ||
|
|
5d86982421 | ||
|
|
1f94997120 | ||
|
|
c3f113f39b | ||
|
|
32b08788c9 | ||
|
|
91c64ff08b | ||
|
|
ffb1042146 | ||
|
|
fbee85ec08 | ||
|
|
f59c9543d5 | ||
|
|
36aeaeed2f |
No files matched your search
@@ -5,6 +5,11 @@
|
|||||||
.project
|
.project
|
||||||
.settings
|
.settings
|
||||||
|
|
||||||
|
# IntelliJ Idea settings
|
||||||
|
|
||||||
|
.idea
|
||||||
|
scribe.iml
|
||||||
|
|
||||||
# Binaries
|
# Binaries
|
||||||
|
|
||||||
target
|
target
|
||||||
+27
-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?
|
||||||
@@ -20,10 +18,12 @@ h3. Threadsafe
|
|||||||
|
|
||||||
Hit Scribe as hard and with many threads as you like.
|
Hit Scribe as hard and with many threads as you like.
|
||||||
|
|
||||||
h3. Supports all major OAuth APIs out-of-the-box
|
h3. Supports all major 1.0a and 2.0 OAuth APIs out-of-the-box
|
||||||
|
|
||||||
* Google
|
* Google
|
||||||
|
|
||||||
|
* Facebook
|
||||||
|
|
||||||
* Yahoo
|
* Yahoo
|
||||||
|
|
||||||
* LinkedIn
|
* LinkedIn
|
||||||
@@ -32,6 +32,14 @@ h3. Supports all major OAuth APIs out-of-the-box
|
|||||||
|
|
||||||
* Foursquare
|
* Foursquare
|
||||||
|
|
||||||
|
* Evernote
|
||||||
|
|
||||||
|
* Vimeo
|
||||||
|
|
||||||
|
* 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
|
||||||
@@ -48,12 +56,28 @@ Good test coverage to keep you safe from harm.
|
|||||||
|
|
||||||
When something bad actually happens, Scribe's meaningful error messages will tell you exactly what went wrong, when and where.
|
When something bad actually happens, Scribe's meaningful error messages will tell you exactly what went wrong, when and where.
|
||||||
|
|
||||||
|
h3. Pull it from Maven! (new)
|
||||||
|
|
||||||
|
You can pull scribe from a maven repository, just add this to your __pom.xml__ file:
|
||||||
|
|
||||||
|
@<dependency>@
|
||||||
|
@<groupId>org.scribe</groupId>@
|
||||||
|
@<artifactId>scribe</artifactId>@
|
||||||
|
@<version>1.3.0</version>@
|
||||||
|
@</dependency>@
|
||||||
|
|
||||||
h1. Getting started in less than 2 minutes
|
h1. Getting started in less than 2 minutes
|
||||||
|
|
||||||
Check the "Getting Started":http://wiki.github.com/fernandezpablo85/scribe-java/getting-started page and start rocking!
|
Check the "Getting Started":http://wiki.github.com/fernandezpablo85/scribe-java/getting-started page and start rocking!
|
||||||
|
|
||||||
h1. Please Read the "FAQ":http://wiki.github.com/fernandezpablo85/scribe-java/faq before creating an issue :)
|
h1. Please Read the "FAQ":http://wiki.github.com/fernandezpablo85/scribe-java/faq before creating an issue :)
|
||||||
|
|
||||||
|
h1. Questions?
|
||||||
|
|
||||||
|
Feel free to drop me an email, but there's already a "StackOvferflow":http://stackoverflow.com tag for "scribe":http://stackoverflow.com/questions/tagged/scribe you should use. I'm subscribed to it so I'll pick the question immediately.
|
||||||
|
|
||||||
|
Note that it really helps to run scribe on **debug** mode (since 1.3.0), to get additional info. To do this simply call the @.debug()@ method on the @ServiceBuilder@.
|
||||||
|
|
||||||
h1. About me
|
h1. About me
|
||||||
|
|
||||||
"LinkedIn profile":http://www.linkedin.com/in/fernandezpablo85
|
"LinkedIn profile":http://www.linkedin.com/in/fernandezpablo85
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
mvn source:jar javadoc:jar package gpg:sign repository:bundle-create -Dgpg.passphrase=$1
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
[1.0.6]
|
||||||
|
|
||||||
|
* FEATURE: Available in maven central repositories.
|
||||||
|
|
||||||
|
[1.0.7]
|
||||||
|
|
||||||
|
* FEATURE: Added support for Yammer and Evernote ( thanks oparrsih )
|
||||||
|
* FIX: Fixed bug that preventing setting the scope param on Google Api
|
||||||
|
|
||||||
|
[1.0.8]
|
||||||
|
|
||||||
|
* FEATURE: Added setConnectTimeout and setReadTimeout for the Request Object
|
||||||
|
* FIX: Fixed Evernote Api (uses GET for request and access tokens)
|
||||||
|
* REFACTOR: URLEncoding stuff. LinkedIn specific decoder is no longer needed
|
||||||
|
* FEATURE: Added Google example
|
||||||
|
|
||||||
|
[1.0.9]
|
||||||
|
|
||||||
|
* FEATURE: Token made Serializable
|
||||||
|
* FIX: Google Api encoding issues (thanks @roger and @klakegg)
|
||||||
|
|
||||||
|
[1.1.0]
|
||||||
|
|
||||||
|
* FEATURE: OAuth 2.0 Support and Facebook support out of the box (thanks Diego Silveira)
|
||||||
|
* REFACTOR: Api creation and OAuthService refactors
|
||||||
|
* REFACTOR: Connections are created lazily (just before sending the request)
|
||||||
|
|
||||||
|
[1.1.1]
|
||||||
|
|
||||||
|
* FIX: Removed isEmpty() from OAuth2.0 code in order to support older JVMs
|
||||||
|
* FEATURE: Overloaded provider() method to support instances as well as classes (thanks dustismo)
|
||||||
|
* FIX: White-space parameter bug (thanks Krogoth)
|
||||||
|
* FEATURE: OAuth 2.0 now implements server-flow (thanks Diego Silveira)
|
||||||
|
|
||||||
|
[1.1.2]
|
||||||
|
|
||||||
|
* 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: Added support for JDK 1.5. Issue #146 (thanks Sripathi Krishnan)
|
||||||
|
* FIX: Invalid character constant error message. Issue #137 (thanks Scott Scoble)
|
||||||
|
* FEATURE: Added a Api class to handle windows live authentication. Issue #135 (thanks Tomas Lin)
|
||||||
|
* FEATURE: Added refresh token feature for Yahoo! API. Issue #134 (thanks Aaron Foltz)
|
||||||
|
* FEATURE: Added support for Plurk API. Issue #130 (thanks Chia-Wei Li)
|
||||||
|
* FIX: Request.setConnectTimeout() and setReadTimeout() throw NPE. Issue #123 (thanks thepizzle)
|
||||||
|
|
||||||
|
[1.2.3]
|
||||||
|
* FEATURE: Added default Content-Type header
|
||||||
|
* FEATURE: Sapo Api
|
||||||
|
* FEATURE: Plurk Mobile Api
|
||||||
|
* FEATURE: Kaixin and QWeibo Apis
|
||||||
|
* FEATURE: SimpleGeo Api
|
||||||
@@ -4,8 +4,44 @@
|
|||||||
<groupId>org.scribe</groupId>
|
<groupId>org.scribe</groupId>
|
||||||
<artifactId>scribe</artifactId>
|
<artifactId>scribe</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<version>1.0.3</version>
|
<version>1.3.0</version>
|
||||||
<name>OAuth Library</name>
|
<name>Scribe OAuth Library</name>
|
||||||
|
<description>The best OAuth library out there</description>
|
||||||
|
<url>http://github.com/fernandezpablo85/scribe-java</url>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
<artifactId>oss-parent</artifactId>
|
||||||
|
<version>5</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<id>fernandezpablo85</id>
|
||||||
|
<name>Pablo Fernandez</name>
|
||||||
|
<email>fernandezpablo85@gmail.com</email>
|
||||||
|
<timezone>-3</timezone>
|
||||||
|
</developer>
|
||||||
|
<developer>
|
||||||
|
<id>diegossilveira</id>
|
||||||
|
<name>Diego Silveira</name>
|
||||||
|
<email>diegossilveira@gmail.com</email>
|
||||||
|
<timezone>-3</timezone>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>MIT</name>
|
||||||
|
<url>http://github.com/fernandezpablo85/scribe-java/blob/master/LICENSE.txt</url>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:http://github.com/fernandezpablo85/scribe-java.git</connection>
|
||||||
|
<developerConnection>scm:http://github.com/fernandezpablo85/scribe-java.git</developerConnection>
|
||||||
|
<url>http://github.com/fernandezpablo85/scribe-java.git</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -18,6 +54,7 @@
|
|||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.8.1</version>
|
<version>4.8.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -26,10 +63,23 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.6</source>
|
<source>1.5</source>
|
||||||
<target>1.6</target>
|
<target>1.5</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.scribe.builder;
|
package org.scribe.builder;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
import org.scribe.builder.api.*;
|
import org.scribe.builder.api.*;
|
||||||
import org.scribe.exceptions.*;
|
import org.scribe.exceptions.*;
|
||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
import org.scribe.oauth.*;
|
import org.scribe.oauth.*;
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
@@ -20,10 +20,18 @@ public class ServiceBuilder
|
|||||||
private String apiSecret;
|
private String apiSecret;
|
||||||
private String callback;
|
private String callback;
|
||||||
private Api api;
|
private Api api;
|
||||||
|
private String scope;
|
||||||
|
private SignatureType signatureType;
|
||||||
|
private OutputStream debugStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*/
|
||||||
public ServiceBuilder()
|
public ServiceBuilder()
|
||||||
{
|
{
|
||||||
this.callback = OAuthConstants.OUT_OF_BAND;
|
this.callback = OAuthConstants.OUT_OF_BAND;
|
||||||
|
this.signatureType = SignatureType.Header;
|
||||||
|
this.debugStream = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,7 +60,22 @@ public class ServiceBuilder
|
|||||||
}
|
}
|
||||||
return api;
|
return api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link Api}
|
||||||
|
*
|
||||||
|
* Overloaded version. Let's you use an instance instead of a class.
|
||||||
|
*
|
||||||
|
* @param api instance of {@link Api}s
|
||||||
|
* @return the {@link ServiceBuilder} instance for method chaining
|
||||||
|
*/
|
||||||
|
public ServiceBuilder provider(Api api)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(api, "Api cannot be null");
|
||||||
|
this.api = api;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an OAuth callback url
|
* Adds an OAuth callback url
|
||||||
*
|
*
|
||||||
@@ -92,6 +115,45 @@ public class ServiceBuilder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the OAuth scope. This is only necessary in some APIs (like Google's).
|
||||||
|
*
|
||||||
|
* @param scope The OAuth scope
|
||||||
|
* @return the {@link ServiceBuilder} instance for method chaining
|
||||||
|
*/
|
||||||
|
public ServiceBuilder scope(String scope)
|
||||||
|
{
|
||||||
|
Preconditions.checkEmptyString(scope, "Invalid OAuth scope");
|
||||||
|
this.scope = scope;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceBuilder debugStream(OutputStream stream)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(stream, "debug stream can't be null");
|
||||||
|
this.debugStream = stream;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceBuilder debug()
|
||||||
|
{
|
||||||
|
this.debugStream(System.out);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the fully configured {@link OAuthService}
|
* Returns the fully configured {@link OAuthService}
|
||||||
*
|
*
|
||||||
@@ -102,6 +164,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(apiKey, apiSecret, callback);
|
return api.createService(new OAuthConfig(apiKey, apiSecret, callback, signatureType, scope, debugStream));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
import org.scribe.oauth.*;
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,8 +17,9 @@ public interface Api
|
|||||||
* @param apiKey your application api key
|
* @param apiKey your application api key
|
||||||
* @param apiSecret your application api secret
|
* @param apiSecret your application api secret
|
||||||
* @param callback the callback url (or 'oob' for out of band OAuth)
|
* @param callback the callback url (or 'oob' for out of band OAuth)
|
||||||
|
* @param scope the OAuth scope
|
||||||
*
|
*
|
||||||
* @return fully configured {@link OAuthService}
|
* @return fully configured {@link OAuthService}
|
||||||
*/
|
*/
|
||||||
OAuthService createService(String apiKey, String apiSecret, String callback);
|
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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,74 +5,137 @@ import org.scribe.model.*;
|
|||||||
import org.scribe.oauth.*;
|
import org.scribe.oauth.*;
|
||||||
import org.scribe.services.*;
|
import org.scribe.services.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of the OAuth protocol, version 1.0a
|
||||||
|
*
|
||||||
|
* This class is meant to be extended by concrete implementations of the API,
|
||||||
|
* providing the endpoints and endpoint-http-verbs.
|
||||||
|
*
|
||||||
|
* If your Api adheres to the 1.0a protocol correctly, you just need to extend
|
||||||
|
* this class and define the getters for your endpoints.
|
||||||
|
*
|
||||||
|
* If your Api does something a bit different, you can override the different
|
||||||
|
* extractors or services, in order to fine-tune the process. Please read the
|
||||||
|
* javadocs of the interfaces to get an idea of what to do.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
public abstract class DefaultApi10a implements Api
|
public abstract class DefaultApi10a implements Api
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Returns the access token extractor.
|
||||||
|
*
|
||||||
|
* @return access token extractor
|
||||||
|
*/
|
||||||
public AccessTokenExtractor getAccessTokenExtractor()
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
{
|
{
|
||||||
return new TokenExtractorImpl();
|
return new TokenExtractorImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the base string extractor.
|
||||||
|
*
|
||||||
|
* @return base string extractor
|
||||||
|
*/
|
||||||
public BaseStringExtractor getBaseStringExtractor()
|
public BaseStringExtractor getBaseStringExtractor()
|
||||||
{
|
{
|
||||||
return new BaseStringExtractorImpl();
|
return new BaseStringExtractorImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the header extractor.
|
||||||
|
*
|
||||||
|
* @return header extractor
|
||||||
|
*/
|
||||||
public HeaderExtractor getHeaderExtractor()
|
public HeaderExtractor getHeaderExtractor()
|
||||||
{
|
{
|
||||||
return new HeaderExtractorImpl();
|
return new HeaderExtractorImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the request token extractor.
|
||||||
|
*
|
||||||
|
* @return request token extractor
|
||||||
|
*/
|
||||||
public RequestTokenExtractor getRequestTokenExtractor()
|
public RequestTokenExtractor getRequestTokenExtractor()
|
||||||
{
|
{
|
||||||
return new TokenExtractorImpl();
|
return new TokenExtractorImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the signature service.
|
||||||
|
*
|
||||||
|
* @return signature service
|
||||||
|
*/
|
||||||
public SignatureService getSignatureService()
|
public SignatureService getSignatureService()
|
||||||
{
|
{
|
||||||
return new HMACSha1SignatureService();
|
return new HMACSha1SignatureService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the timestamp service.
|
||||||
|
*
|
||||||
|
* @return timestamp service
|
||||||
|
*/
|
||||||
public TimestampService getTimestampService()
|
public TimestampService getTimestampService()
|
||||||
{
|
{
|
||||||
return new TimestampServiceImpl();
|
return new TimestampServiceImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the verb for the access token endpoint (defaults to POST)
|
||||||
|
*
|
||||||
|
* @return access token endpoint verb
|
||||||
|
*/
|
||||||
public Verb getAccessTokenVerb()
|
public Verb getAccessTokenVerb()
|
||||||
{
|
{
|
||||||
return Verb.POST;
|
return Verb.POST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the verb for the request token endpoint (defaults to POST)
|
||||||
|
*
|
||||||
|
* @return request token endpoint verb
|
||||||
|
*/
|
||||||
public Verb getRequestTokenVerb()
|
public Verb getRequestTokenVerb()
|
||||||
{
|
{
|
||||||
return Verb.POST;
|
return Verb.POST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL that receives the request token requests.
|
||||||
|
*
|
||||||
|
* @return request token URL
|
||||||
|
*/
|
||||||
public abstract String getRequestTokenEndpoint();
|
public abstract String getRequestTokenEndpoint();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL that receives the access token requests.
|
||||||
|
*
|
||||||
|
* @return access token URL
|
||||||
|
*/
|
||||||
public abstract String getAccessTokenEndpoint();
|
public abstract String getAccessTokenEndpoint();
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public OAuthService createService(String apiKey, String apiSecret, String callback)
|
* Returns the URL where you should redirect your users to authenticate
|
||||||
|
* your application.
|
||||||
|
*
|
||||||
|
* @param requestToken the request token you need to authorize
|
||||||
|
* @return the URL where you should redirect your users
|
||||||
|
*/
|
||||||
|
public abstract String getAuthorizationUrl(Token requestToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link OAuthService} for this Api
|
||||||
|
*
|
||||||
|
* @param apiKey Key
|
||||||
|
* @param apiSecret Api Secret
|
||||||
|
* @param callback OAuth callback (either URL or 'oob')
|
||||||
|
* @param scope OAuth scope (optional)
|
||||||
|
*/
|
||||||
|
public OAuthService createService(OAuthConfig config)
|
||||||
{
|
{
|
||||||
return new OAuth10aServiceImpl( getSignatureService(),
|
return new OAuth10aServiceImpl(this, config);
|
||||||
getTimestampService(),
|
|
||||||
getBaseStringExtractor(),
|
|
||||||
getHeaderExtractor(),
|
|
||||||
getRequestTokenExtractor(),
|
|
||||||
getAccessTokenExtractor(),
|
|
||||||
createConfig(apiKey, apiSecret, callback));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private OAuthConfig createConfig(String apiKey, String apiSecret, String callback)
|
|
||||||
{
|
|
||||||
OAuthConfig config = new OAuthConfig();
|
|
||||||
config.setRequestTokenVerb(getRequestTokenVerb());
|
|
||||||
config.setRequestTokenEndpoint(getRequestTokenEndpoint());
|
|
||||||
config.setAccessTokenVerb(getAccessTokenVerb());
|
|
||||||
config.setAccessTokenEndpoint(getAccessTokenEndpoint());
|
|
||||||
config.setApiKey(apiKey);
|
|
||||||
config.setApiSecret(apiSecret);
|
|
||||||
config.setCallback(callback);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.extractors.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of the OAuth protocol, version 2.0 (draft 11)
|
||||||
|
*
|
||||||
|
* This class is meant to be extended by concrete implementations of the API,
|
||||||
|
* providing the endpoints and endpoint-http-verbs.
|
||||||
|
*
|
||||||
|
* If your Api adheres to the 2.0 (draft 11) protocol correctly, you just need to extend
|
||||||
|
* this class and define the getters for your endpoints.
|
||||||
|
*
|
||||||
|
* If your Api does something a bit different, you can override the different
|
||||||
|
* extractors or services, in order to fine-tune the process. Please read the
|
||||||
|
* javadocs of the interfaces to get an idea of what to do.
|
||||||
|
*
|
||||||
|
* @author Diego Silveira
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class DefaultApi20 implements Api
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the access token extractor.
|
||||||
|
*
|
||||||
|
* @return access token extractor
|
||||||
|
*/
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new TokenExtractor20Impl();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the verb for the access token endpoint (defaults to GET)
|
||||||
|
*
|
||||||
|
* @return access token endpoint verb
|
||||||
|
*/
|
||||||
|
public Verb getAccessTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL that receives the access token requests.
|
||||||
|
*
|
||||||
|
* @return access token URL
|
||||||
|
*/
|
||||||
|
public abstract String getAccessTokenEndpoint();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL where you should redirect your users to authenticate
|
||||||
|
* your application.
|
||||||
|
*
|
||||||
|
* @param config OAuth 2.0 configuration param object
|
||||||
|
* @return the URL where you should redirect your users
|
||||||
|
*/
|
||||||
|
public abstract String getAuthorizationUrl(OAuthConfig config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public OAuthService createService(OAuthConfig 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";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
import org.scribe.model.Verb;
|
||||||
|
|
||||||
|
public class EvernoteApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "https://www.evernote.com/OAuth.action?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getRequestTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://www.evernote.com/oauth";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getAccessTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://www.evernote.com/oauth";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Sandbox extends EvernoteApi
|
||||||
|
{
|
||||||
|
private static final String SANDBOX_URL = "https://sandbox.evernote.com/oauth";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return SANDBOX_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return SANDBOX_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(SANDBOX_URL + "?oauth_token=%s", requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
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 SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://graph.facebook.com/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(OAuthConfig config)
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Facebook does not support OOB");
|
||||||
|
|
||||||
|
// 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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(), OAuthEncoder.encode(config.getCallback()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new JsonTokenExtractor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
public class FoursquareApi extends DefaultApi10a
|
public class FoursquareApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "http://foursquare.com/oauth/authorize?oauth_token=%s";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
{
|
{
|
||||||
@@ -13,4 +17,10 @@ public class FoursquareApi extends DefaultApi10a
|
|||||||
{
|
{
|
||||||
return "http://foursquare.com/oauth/request_token";
|
return "http://foursquare.com/oauth/request_token";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,16 +1,38 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
public class GoogleApi extends DefaultApi10a
|
public class GoogleApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=%s";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
{
|
{
|
||||||
return "https://www.google.com/accounts/OAuthGetRequestToken";
|
return "https://www.google.com/accounts/OAuthGetAccessToken";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRequestTokenEndpoint()
|
public String getRequestTokenEndpoint()
|
||||||
{
|
{
|
||||||
return "https://www.google.com/accounts/OAuthGetAccessToken";
|
return "https://www.google.com/accounts/OAuthGetRequestToken";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getAccessTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getRequestTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class KaixinApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "http://api.kaixin001.com/oauth/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "http://api.kaixin001.com/oauth/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "http://api.kaixin001.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());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getRequestTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getAccessTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
import org.scribe.extensions.linkedin.*;
|
import org.scribe.model.*;
|
||||||
import org.scribe.extractors.*;
|
|
||||||
|
|
||||||
public class LinkedInApi extends DefaultApi10a
|
public class LinkedInApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
|
private static final String AUTHORIZE_URL = "https://api.linkedin.com/uas/oauth/authorize?oauth_token=%s";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
@@ -19,9 +19,9 @@ public class LinkedInApi extends DefaultApi10a
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BaseStringExtractor getBaseStringExtractor()
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
{
|
{
|
||||||
return new LinkedInBaseStringExtractorImpl();
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.extractors.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
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(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(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,39 @@
|
|||||||
|
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 AUTHORIZATION_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(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_TOKEN_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Mobile extends PlurkApi
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "http://www.plurk.com/m/authorize?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class QWeiboApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String REQUEST_TOKEN_URL = "https://open.t.qq.com/cgi-bin/request_token";
|
||||||
|
private static final String ACCESS_TOKEN_URL = "https://open.t.qq.com/cgi-bin/access_token";
|
||||||
|
private static final String AUTHORIZE_URL = "https://open.t.qq.com/cgi-bin/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,40 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class SapoApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZE_URL = "https://id.sapo.pt/oauth/authorize?oauth_token=%s";
|
||||||
|
private static final String ACCESS_URL = "https://id.sapo.pt/oauth/access_token";
|
||||||
|
private static final String REQUEST_URL = "https://id.sapo.pt/oauth/request_token";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ACCESS_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return REQUEST_URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getRequestTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Verb getAccessTokenVerb()
|
||||||
|
{
|
||||||
|
return Verb.GET;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class SimpleGeoApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String ENDPOINT = "these are not used since SimpleGeo uses 2 legged OAuth";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ENDPOINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return ENDPOINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return ENDPOINT;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,66 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
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 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://twitter.com/oauth/access_token";
|
return "http://" + ACCESS_TOKEN_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRequestTokenEndpoint()
|
public String getRequestTokenEndpoint()
|
||||||
{
|
{
|
||||||
return "http://twitter.com/oauth/request_token";
|
return "http://" + REQUEST_TOKEN_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Twitter 'friendlier' authorization endpoint for OAuth.
|
||||||
|
*
|
||||||
|
* Uses SSL.
|
||||||
|
*/
|
||||||
|
public static class Authenticate extends SSL
|
||||||
|
{
|
||||||
|
private static final String AUTHENTICATE_URL = "https://api.twitter.com/oauth/authenticate?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHENTICATE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just an alias to the default (SSL) authorization endpoint.
|
||||||
|
*
|
||||||
|
* Need to include this for symmetry with 'Authenticate' only.
|
||||||
|
*/
|
||||||
|
public static class Authorize extends SSL{}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
|
public class VimeoApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "http://vimeo.com/oauth/authorize?oauth_token=%s";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "http://vimeo.com/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "http://vimeo.com/oauth/request_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessTokenExtractor getAccessTokenExtractor()
|
||||||
|
{
|
||||||
|
return new JsonTokenExtractor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
package org.scribe.builder.api;
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.Token;
|
||||||
|
|
||||||
public class YahooApi extends DefaultApi10a
|
public class YahooApi extends DefaultApi10a
|
||||||
{
|
{
|
||||||
|
private static final String AUTHORIZE_URL = "https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token=%s";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAccessTokenEndpoint()
|
public String getAccessTokenEndpoint()
|
||||||
{
|
{
|
||||||
@@ -13,4 +17,10 @@ public class YahooApi extends DefaultApi10a
|
|||||||
{
|
{
|
||||||
return "https://api.login.yahoo.com/oauth/v2/get_request_token";
|
return "https://api.login.yahoo.com/oauth/v2/get_request_token";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZE_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.scribe.builder.api;
|
||||||
|
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.services.*;
|
||||||
|
|
||||||
|
public class YammerApi extends DefaultApi10a
|
||||||
|
{
|
||||||
|
private static final String AUTHORIZATION_URL = "'https://www.yammer.com/oauth/authorize?oauth_token=%s'";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://www.yammer.com/oauth/request_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessTokenEndpoint()
|
||||||
|
{
|
||||||
|
return "https://www.yammer.com/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return String.format(AUTHORIZATION_URL, requestToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SignatureService getSignatureService()
|
||||||
|
{
|
||||||
|
return new PlaintextSignatureService();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,33 @@
|
|||||||
package org.scribe.exceptions;
|
package org.scribe.exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default scribe exception.
|
||||||
|
* Represents a problem in the OAuth signing process
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class OAuthException extends RuntimeException
|
public class OAuthException extends RuntimeException
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
* @param message message explaining what went wrong
|
||||||
|
* @param e original exception
|
||||||
|
*/
|
||||||
public OAuthException(String message, Exception e)
|
public OAuthException(String message, Exception e)
|
||||||
{
|
{
|
||||||
super(message, e);
|
super(message, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No-exception constructor. Used when there is no original exception
|
||||||
|
*
|
||||||
|
* @param message message explaining what went wrong
|
||||||
|
*/
|
||||||
public OAuthException(String message)
|
public OAuthException(String message)
|
||||||
{
|
{
|
||||||
super(message, null);
|
super(message, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,11 @@ package org.scribe.exceptions;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialized exception that represents a missing OAuth parameter.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class OAuthParametersMissingException extends OAuthException
|
public class OAuthParametersMissingException extends OAuthException
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -9,6 +14,11 @@ public class OAuthParametersMissingException extends OAuthException
|
|||||||
private static final String MSG = "Could not find oauth parameters in request: %s. "
|
private static final String MSG = "Could not find oauth parameters in request: %s. "
|
||||||
+ "OAuth parameters must be specified with the addOAuthParameter() method";
|
+ "OAuth parameters must be specified with the addOAuthParameter() method";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*
|
||||||
|
* @param request OAuthRequest that caused the error
|
||||||
|
*/
|
||||||
public OAuthParametersMissingException(OAuthRequest request)
|
public OAuthParametersMissingException(OAuthRequest request)
|
||||||
{
|
{
|
||||||
super(String.format(MSG, request));
|
super(String.format(MSG, request));
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
package org.scribe.exceptions;
|
package org.scribe.exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialized exception that represents a problem in the signature
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class OAuthSignatureException extends OAuthException
|
public class OAuthSignatureException extends OAuthException
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*
|
||||||
|
* @param stringToSign plain string that gets signed (HMAC-SHA, etc)
|
||||||
|
* @param e original exception
|
||||||
|
*/
|
||||||
public OAuthSignatureException(String stringToSign, Exception e)
|
public OAuthSignatureException(String stringToSign, Exception e)
|
||||||
{
|
{
|
||||||
super("Error while signing string: " + stringToSign, e);
|
super("Error while signing string: " + stringToSign, e);
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package org.scribe.extensions.linkedin;
|
|
||||||
|
|
||||||
import org.scribe.extractors.*;
|
|
||||||
import org.scribe.model.*;
|
|
||||||
|
|
||||||
public class LinkedInBaseStringExtractorImpl extends BaseStringExtractorImpl
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String extract(OAuthRequest request)
|
|
||||||
{
|
|
||||||
String baseString = super.extract(request);
|
|
||||||
return baseString.replace("%7E", "~");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,18 @@ package org.scribe.extractors;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple command object that extracts a {@link Token} from a String
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface AccessTokenExtractor
|
public interface AccessTokenExtractor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Extracts the access token from the contents of an Http Response
|
||||||
|
*
|
||||||
|
* @param response the contents of the response
|
||||||
|
* @return OAuth access token
|
||||||
|
*/
|
||||||
public Token extract(String response);
|
public Token extract(String response);
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,20 @@ package org.scribe.extractors;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple command object that extracts a base string from a {@link OAuthRequest}
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface BaseStringExtractor
|
public interface BaseStringExtractor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Extracts an url-encoded base string from the {@link OAuthRequest}.
|
||||||
|
*
|
||||||
|
* See <a href="http://oauth.net/core/1.0/#anchor14">the oauth spec</a> for more info on this.
|
||||||
|
*
|
||||||
|
* @param request the OAuthRequest
|
||||||
|
* @return the url-encoded base string
|
||||||
|
*/
|
||||||
String extract(OAuthRequest request);
|
String extract(OAuthRequest request);
|
||||||
}
|
}
|
||||||
@@ -1,33 +1,39 @@
|
|||||||
package org.scribe.extractors;
|
package org.scribe.extractors;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import org.scribe.exceptions.*;
|
import org.scribe.exceptions.*;
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of {@link BaseStringExtractor}. Conforms to OAuth 1.0a
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class BaseStringExtractorImpl implements BaseStringExtractor
|
public class BaseStringExtractorImpl implements BaseStringExtractor
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String AMPERSAND_SEPARATED_STRING = "%s&%s&%s";
|
private static final String AMPERSAND_SEPARATED_STRING = "%s&%s&%s";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String extract(OAuthRequest request)
|
public String extract(OAuthRequest request)
|
||||||
{
|
{
|
||||||
checkPreconditions(request);
|
checkPreconditions(request);
|
||||||
String verb = URLUtils.percentEncode(request.getVerb().name());
|
String verb = OAuthEncoder.encode(request.getVerb().name());
|
||||||
String url = URLUtils.percentEncode(request.getSanitizedUrl());
|
String url = OAuthEncoder.encode(request.getSanitizedUrl());
|
||||||
String params = getSortedAndEncodedParams(request);
|
String params = getSortedAndEncodedParams(request);
|
||||||
return String.format(AMPERSAND_SEPARATED_STRING, verb, url, params);
|
return String.format(AMPERSAND_SEPARATED_STRING, verb, url, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getSortedAndEncodedParams(OAuthRequest request)
|
private String getSortedAndEncodedParams(OAuthRequest request)
|
||||||
{
|
{
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
ParameterList params = new ParameterList();
|
||||||
params.putAll(request.getQueryStringParams());
|
params.addAll(request.getQueryStringParams());
|
||||||
params.putAll(request.getBodyParams());
|
params.addAll(request.getBodyParams());
|
||||||
params.putAll(request.getOauthParameters());
|
params.addAll(new ParameterList(request.getOauthParameters()));
|
||||||
params = MapUtils.sort(params);
|
return params.sort().asOauthBaseString();
|
||||||
return URLUtils.percentEncode(URLUtils.formURLEncodeMap(params));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPreconditions(OAuthRequest request)
|
private void checkPreconditions(OAuthRequest request)
|
||||||
|
|||||||
@@ -2,7 +2,18 @@ package org.scribe.extractors;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple command object that generates an OAuth Authorization header to include in the request.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface HeaderExtractor
|
public interface HeaderExtractor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Generates an OAuth 'Authorization' Http header to include in requests as the signature.
|
||||||
|
*
|
||||||
|
* @param request the OAuthRequest to inspect and generate the header
|
||||||
|
* @return the Http header value
|
||||||
|
*/
|
||||||
String extract(OAuthRequest request);
|
String extract(OAuthRequest request);
|
||||||
}
|
}
|
||||||
@@ -6,11 +6,20 @@ import org.scribe.exceptions.*;
|
|||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of {@link HeaderExtractor}. Conforms to OAuth 1.0a
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class HeaderExtractorImpl implements HeaderExtractor
|
public class HeaderExtractorImpl implements HeaderExtractor
|
||||||
{
|
{
|
||||||
private static final String PARAM_SEPARATOR = ", ";
|
private static final String PARAM_SEPARATOR = ", ";
|
||||||
private static final String PREAMBLE = "OAuth ";
|
private static final String PREAMBLE = "OAuth ";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String extract(OAuthRequest request)
|
public String extract(OAuthRequest request)
|
||||||
{
|
{
|
||||||
checkPreconditions(request);
|
checkPreconditions(request);
|
||||||
@@ -23,7 +32,7 @@ public class HeaderExtractorImpl implements HeaderExtractor
|
|||||||
{
|
{
|
||||||
header.append(PARAM_SEPARATOR);
|
header.append(PARAM_SEPARATOR);
|
||||||
}
|
}
|
||||||
header.append(String.format("%s=\"%s\"", key, URLUtils.percentEncode(parameters.get(key))));
|
header.append(String.format("%s=\"%s\"", key, OAuthEncoder.encode(parameters.get(key))));
|
||||||
}
|
}
|
||||||
return header.toString();
|
return header.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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*\"(\\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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,8 +2,18 @@ package org.scribe.extractors;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple command object that extracts a {@link Token} from a String
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface RequestTokenExtractor
|
public interface RequestTokenExtractor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Extracts the request token from the contents of an Http Response
|
||||||
|
*
|
||||||
|
* @param response the contents of the response
|
||||||
|
* @return OAuth access token
|
||||||
|
*/
|
||||||
public Token extract(String response);
|
public Token extract(String response);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.scribe.extractors;
|
||||||
|
|
||||||
|
import java.util.regex.*;
|
||||||
|
|
||||||
|
import org.scribe.exceptions.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of {@AccessTokenExtractor}. Conforms to OAuth 2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TokenExtractor20Impl implements AccessTokenExtractor
|
||||||
|
{
|
||||||
|
private static final String TOKEN_REGEX = "access_token=([^&]+)";
|
||||||
|
private static final String EMPTY_SECRET = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
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(TOKEN_REGEX).matcher(response);
|
||||||
|
if (matcher.find())
|
||||||
|
{
|
||||||
|
String token = OAuthEncoder.decode(matcher.group(1));
|
||||||
|
return new Token(token, EMPTY_SECRET, response);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,24 +6,39 @@ import org.scribe.exceptions.*;
|
|||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of {@RequestTokenExtractor} and {@AccessTokenExtractor}. Conforms to OAuth 1.0a
|
||||||
|
*
|
||||||
|
* The process for extracting access and request tokens is similar so this class can do both things.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExtractor
|
public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExtractor
|
||||||
{
|
{
|
||||||
|
private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)");
|
||||||
|
private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]+)");
|
||||||
|
|
||||||
private static final String TOKEN_REGEX = "oauth_token=(\\S*)&oauth_token_secret=(\\S*?)(&(.*))?";
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Token extract(String response)
|
public Token extract(String response)
|
||||||
{
|
{
|
||||||
Preconditions.checkEmptyString(response, "Cant extract a token from null object or 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())
|
{
|
||||||
|
Matcher matcher = p.matcher(response);
|
||||||
|
if (matcher.find() && matcher.groupCount() >= 1)
|
||||||
{
|
{
|
||||||
String token = URLUtils.percentDecode(matcher.group(1));
|
return OAuthEncoder.decode(matcher.group(1));
|
||||||
String secret = URLUtils.percentDecode(matcher.group(2));
|
}
|
||||||
return new Token(token, secret);
|
else
|
||||||
} else
|
|
||||||
{
|
{
|
||||||
throw new OAuthException("Could not find request token or secret in response: " + response, null);
|
throw new OAuthException("Response body is incorrect. Can't extract token and secret from this: '" + response + "'", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,83 +1,79 @@
|
|||||||
package org.scribe.model;
|
package org.scribe.model;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parameter object that groups OAuth config values
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
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 String requestTokenEndpoint;
|
private final SignatureType signatureType;
|
||||||
private String accessTokenEndpoint;
|
private final String scope;
|
||||||
private Verb requestTokenVerb;
|
private final OutputStream debugStream;
|
||||||
private Verb accessTokenVerb;
|
|
||||||
|
public OAuthConfig(String key, String secret)
|
||||||
|
{
|
||||||
|
this(key, secret, null, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OAuthConfig(String key, String secret, String callback, SignatureType type, String scope, OutputStream stream)
|
||||||
|
{
|
||||||
|
this.apiKey = key;
|
||||||
|
this.apiSecret = secret;
|
||||||
|
this.callback = callback;
|
||||||
|
this.signatureType = type;
|
||||||
|
this.scope = scope;
|
||||||
|
this.debugStream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
public String getApiKey()
|
public String getApiKey()
|
||||||
{
|
{
|
||||||
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 getRequestTokenEndpoint()
|
public String getScope()
|
||||||
{
|
{
|
||||||
return requestTokenEndpoint;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRequestTokenEndpoint(String requestTokenEndpoint)
|
public boolean hasScope()
|
||||||
{
|
{
|
||||||
this.requestTokenEndpoint = requestTokenEndpoint;
|
return scope != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAccessTokenEndpoint()
|
public void log(String message)
|
||||||
{
|
{
|
||||||
return accessTokenEndpoint;
|
if (debugStream != null)
|
||||||
|
{
|
||||||
|
message = message + "\n";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
debugStream.write(message.getBytes("UTF8"));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// do nothing.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public void setAccessTokenEndpoint(String accessTokenEndpoint)
|
|
||||||
{
|
|
||||||
this.accessTokenEndpoint = accessTokenEndpoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Verb getRequestTokenVerb()
|
|
||||||
{
|
|
||||||
return requestTokenVerb != null ? requestTokenVerb : Verb.GET;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRequestTokenVerb(Verb requestTokenVerb)
|
|
||||||
{
|
|
||||||
this.requestTokenVerb = requestTokenVerb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Verb getAccessTokenVerb()
|
|
||||||
{
|
|
||||||
return accessTokenVerb != null ? accessTokenVerb : Verb.GET;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAccessTokenVerb(Verb accessTokenVerb)
|
|
||||||
{
|
|
||||||
this.accessTokenVerb = accessTokenVerb;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,6 @@ package org.scribe.model;
|
|||||||
* This class contains OAuth constants, used project-wide
|
* This class contains OAuth constants, used project-wide
|
||||||
*
|
*
|
||||||
* @author Pablo Fernandez
|
* @author Pablo Fernandez
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class OAuthConstants
|
public class OAuthConstants
|
||||||
{
|
{
|
||||||
@@ -38,4 +37,13 @@ public class OAuthConstants
|
|||||||
public static final String VERIFIER = "oauth_verifier";
|
public static final String VERIFIER = "oauth_verifier";
|
||||||
public static final String HEADER = "Authorization";
|
public static final String HEADER = "Authorization";
|
||||||
public static final Token EMPTY_TOKEN = new Token("", "");
|
public static final Token EMPTY_TOKEN = new Token("", "");
|
||||||
|
public static final String SCOPE = "scope";
|
||||||
|
|
||||||
|
//OAuth 2.0
|
||||||
|
public static final String ACCESS_TOKEN = "access_token";
|
||||||
|
public static final String CLIENT_ID = "client_id";
|
||||||
|
public static final String CLIENT_SECRET = "client_secret";
|
||||||
|
public static final String REDIRECT_URI = "redirect_uri";
|
||||||
|
public static final String CODE = "code";
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package org.scribe.model;
|
|
||||||
|
|
||||||
public class OAuthParams
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -2,18 +2,38 @@ package org.scribe.model;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The representation of an OAuth HttpRequest.
|
||||||
|
*
|
||||||
|
* Adds OAuth-related functionality to the {@link Request}
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class OAuthRequest extends Request
|
public class OAuthRequest extends Request
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String OAUTH_PREFIX = "oauth_";
|
private static final String OAUTH_PREFIX = "oauth_";
|
||||||
private Map<String, String> oauthParameters;
|
private Map<String, String> oauthParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*
|
||||||
|
* @param verb Http verb/method
|
||||||
|
* @param url resource URL
|
||||||
|
*/
|
||||||
public OAuthRequest(Verb verb, String url)
|
public OAuthRequest(Verb verb, String url)
|
||||||
{
|
{
|
||||||
super(verb, url);
|
super(verb, url);
|
||||||
this.oauthParameters = new HashMap<String, String>();
|
this.oauthParameters = new HashMap<String, String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an OAuth parameter.
|
||||||
|
*
|
||||||
|
* @param key name of the parameter
|
||||||
|
* @param value value of the parameter
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if the parameter is not an OAuth parameter
|
||||||
|
*/
|
||||||
public void addOAuthParameter(String key, String value)
|
public void addOAuthParameter(String key, String value)
|
||||||
{
|
{
|
||||||
oauthParameters.put(checkKey(key), value);
|
oauthParameters.put(checkKey(key), value);
|
||||||
@@ -21,15 +41,21 @@ public class OAuthRequest extends Request
|
|||||||
|
|
||||||
private String checkKey(String key)
|
private String checkKey(String key)
|
||||||
{
|
{
|
||||||
if (!key.startsWith(OAUTH_PREFIX))
|
if (key.startsWith(OAUTH_PREFIX) || key.equals(OAuthConstants.SCOPE))
|
||||||
{
|
|
||||||
throw new IllegalArgumentException(String.format("OAuth parameters must start with '%s'", OAUTH_PREFIX));
|
|
||||||
} else
|
|
||||||
{
|
{
|
||||||
return key;
|
return key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException(String.format("OAuth parameters must either be '%s' or start with '%s'", OAuthConstants.SCOPE, OAUTH_PREFIX));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link Map} containing the key-value pair of parameters.
|
||||||
|
*
|
||||||
|
* @return parameters as map
|
||||||
|
*/
|
||||||
public Map<String, String> getOauthParameters()
|
public Map<String, String> getOauthParameters()
|
||||||
{
|
{
|
||||||
return oauthParameters;
|
return oauthParameters;
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package org.scribe.model;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import org.scribe.exceptions.OAuthException;
|
||||||
|
import org.scribe.utils.OAuthEncoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class Parameter implements Comparable<Parameter>
|
||||||
|
{
|
||||||
|
private static final String UTF = "UTF8";
|
||||||
|
|
||||||
|
private final String key;
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
public Parameter(String key, String value)
|
||||||
|
{
|
||||||
|
this.key = key;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String asUrlEncodedPair()
|
||||||
|
{
|
||||||
|
return OAuthEncoder.encode(key).concat("=").concat(OAuthEncoder.encode(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object other)
|
||||||
|
{
|
||||||
|
if(other == null) return false;
|
||||||
|
if(other == this) return true;
|
||||||
|
if(!(other instanceof Parameter)) return false;
|
||||||
|
|
||||||
|
Parameter otherParam = (Parameter) other;
|
||||||
|
return otherParam.key.equals(key) && otherParam.value.equals(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return key.hashCode() + value.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compareTo(Parameter parameter)
|
||||||
|
{
|
||||||
|
int keyDiff = key.compareTo(parameter.key);
|
||||||
|
|
||||||
|
return keyDiff != 0 ? keyDiff : value.compareTo(parameter.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
package org.scribe.model;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.scribe.utils.OAuthEncoder;
|
||||||
|
import org.scribe.utils.Preconditions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class ParameterList
|
||||||
|
{
|
||||||
|
private static final char QUERY_STRING_SEPARATOR = '?';
|
||||||
|
private static final String PARAM_SEPARATOR = "&";
|
||||||
|
private static final String PAIR_SEPARATOR = "=";
|
||||||
|
private static final String EMPTY_STRING = "";
|
||||||
|
|
||||||
|
private final List<Parameter> params;
|
||||||
|
|
||||||
|
public ParameterList()
|
||||||
|
{
|
||||||
|
params = new ArrayList<Parameter>();
|
||||||
|
}
|
||||||
|
|
||||||
|
ParameterList(List<Parameter> params)
|
||||||
|
{
|
||||||
|
this.params = new ArrayList<Parameter>(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParameterList(Map<String, String> map)
|
||||||
|
{
|
||||||
|
this();
|
||||||
|
for(Map.Entry<String, String> entry : map.entrySet())
|
||||||
|
{
|
||||||
|
params.add(new Parameter(entry.getKey(), entry.getValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(String key, String value)
|
||||||
|
{
|
||||||
|
params.add(new Parameter(key, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String appendTo(String url)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(url, "Cannot append to null URL");
|
||||||
|
String queryString = asFormUrlEncodedString();
|
||||||
|
if (queryString.equals(EMPTY_STRING))
|
||||||
|
{
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url += url.indexOf(QUERY_STRING_SEPARATOR) != -1 ? PARAM_SEPARATOR : QUERY_STRING_SEPARATOR;
|
||||||
|
url += queryString;
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String asOauthBaseString()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return URLEncoder.encode(asFormUrlEncodedString(), "UTF8");
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String asFormUrlEncodedString()
|
||||||
|
{
|
||||||
|
if (params.size() == 0) return EMPTY_STRING;
|
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for(Parameter p : params)
|
||||||
|
{
|
||||||
|
builder.append('&').append(p.asUrlEncodedPair());
|
||||||
|
}
|
||||||
|
return builder.toString().substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAll(ParameterList other)
|
||||||
|
{
|
||||||
|
params.addAll(other.params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addQuerystring(String queryString)
|
||||||
|
{
|
||||||
|
if (queryString != null && queryString.length() > 0)
|
||||||
|
{
|
||||||
|
for (String param : queryString.split(PARAM_SEPARATOR))
|
||||||
|
{
|
||||||
|
String pair[] = param.split(PAIR_SEPARATOR);
|
||||||
|
String key = OAuthEncoder.decode(pair[0]);
|
||||||
|
String value = pair.length > 1 ? OAuthEncoder.decode(pair[1]) : EMPTY_STRING;
|
||||||
|
params.add(new Parameter(key, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(Parameter param)
|
||||||
|
{
|
||||||
|
return params.contains(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return params.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParameterList sort()
|
||||||
|
{
|
||||||
|
ParameterList sorted = new ParameterList(params);
|
||||||
|
Collections.sort(sorted.params);
|
||||||
|
return sorted;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,10 +2,11 @@ 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 org.scribe.exceptions.*;
|
import org.scribe.exceptions.*;
|
||||||
import org.scribe.utils.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an HTTP Request object
|
* Represents an HTTP Request object
|
||||||
@@ -14,16 +15,22 @@ import org.scribe.utils.*;
|
|||||||
*/
|
*/
|
||||||
class Request
|
class Request
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String CONTENT_LENGTH = "Content-Length";
|
private static final String CONTENT_LENGTH = "Content-Length";
|
||||||
|
private static final String CONTENT_TYPE = "Content-Type";
|
||||||
|
public static final String DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded";
|
||||||
|
|
||||||
private String url;
|
private String url;
|
||||||
private Verb verb;
|
private Verb verb;
|
||||||
private Map<String, String> bodyParams;
|
private ParameterList querystringParams;
|
||||||
|
private ParameterList bodyParams;
|
||||||
private Map<String, String> headers;
|
private Map<String, String> headers;
|
||||||
private String payload = null;
|
private String payload = null;
|
||||||
private Integer timeout = 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
|
||||||
@@ -35,16 +42,9 @@ class Request
|
|||||||
{
|
{
|
||||||
this.verb = verb;
|
this.verb = verb;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.bodyParams = new HashMap<String, String>();
|
this.querystringParams = new ParameterList();
|
||||||
|
this.bodyParams = new ParameterList();
|
||||||
this.headers = new HashMap<String, String>();
|
this.headers = new HashMap<String, String>();
|
||||||
try
|
|
||||||
{
|
|
||||||
connection = (HttpURLConnection) new URL(url).openConnection();
|
|
||||||
if(timeout != null) connection.setConnectTimeout(timeout);
|
|
||||||
} catch (IOException ioe)
|
|
||||||
{
|
|
||||||
throw new OAuthException("Could not open connection to: " + url, ioe);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,20 +58,54 @@ class Request
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
createConnection();
|
||||||
return doSend();
|
return doSend();
|
||||||
} catch (IOException ioe)
|
|
||||||
{
|
|
||||||
throw new OAuthException("Problems while creating connection", ioe);
|
|
||||||
}
|
}
|
||||||
|
catch (UnknownHostException uhe)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Could not reach the desired host. Check your network connection.", uhe);
|
||||||
|
}
|
||||||
|
catch (IOException ioe)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Problems while creating connection.", ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createConnection() throws IOException
|
||||||
|
{
|
||||||
|
String completeUrl = getCompleteUrl();
|
||||||
|
if (connection == null)
|
||||||
|
{
|
||||||
|
System.setProperty("http.keepAlive", connectionKeepAlive ? "true" : "false");
|
||||||
|
connection = (HttpURLConnection) new URL(completeUrl).openConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the complete url (host + resource + encoded querystring parameters).
|
||||||
|
*
|
||||||
|
* @return the complete url.
|
||||||
|
*/
|
||||||
|
public String getCompleteUrl()
|
||||||
|
{
|
||||||
|
return querystringParams.appendTo(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -82,18 +116,24 @@ 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));
|
||||||
|
|
||||||
|
// Set default content type if none is set.
|
||||||
|
if (conn.getRequestProperty(CONTENT_TYPE) == null)
|
||||||
|
{
|
||||||
|
conn.setRequestProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
|
||||||
|
}
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
conn.getOutputStream().write(content.getBytes());
|
conn.getOutputStream().write(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an HTTP Header to the Request
|
* Add an HTTP Header to the Request
|
||||||
*
|
*
|
||||||
* @param name
|
* @param key the header name
|
||||||
* @param value
|
* @param value the header value
|
||||||
*/
|
*/
|
||||||
public void addHeader(String key, String value)
|
public void addHeader(String key, String value)
|
||||||
{
|
{
|
||||||
@@ -103,12 +143,23 @@ class Request
|
|||||||
/**
|
/**
|
||||||
* Add a body Parameter (for POST/ PUT Requests)
|
* Add a body Parameter (for POST/ PUT Requests)
|
||||||
*
|
*
|
||||||
* @param name
|
* @param key the parameter name
|
||||||
* @param value
|
* @param value the parameter value
|
||||||
*/
|
*/
|
||||||
public void addBodyParameter(String key, String value)
|
public void addBodyParameter(String key, String value)
|
||||||
{
|
{
|
||||||
this.bodyParams.put(key, value);
|
this.bodyParams.add(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a QueryString parameter
|
||||||
|
*
|
||||||
|
* @param key the parameter name
|
||||||
|
* @param value the parameter value
|
||||||
|
*/
|
||||||
|
public void addQuerystringParameter(String key, String value)
|
||||||
|
{
|
||||||
|
this.querystringParams.add(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,7 +170,7 @@ class Request
|
|||||||
*
|
*
|
||||||
* Note: The contents are not part of the OAuth signature
|
* Note: The contents are not part of the OAuth signature
|
||||||
*
|
*
|
||||||
* @param payload
|
* @param payload the body of the request
|
||||||
*/
|
*/
|
||||||
public void addPayload(String payload)
|
public void addPayload(String payload)
|
||||||
{
|
{
|
||||||
@@ -127,37 +178,43 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a {@link Map} of the query string parameters.
|
* Overloaded version for byte arrays
|
||||||
*
|
*
|
||||||
* @return a map containing the query string parameters
|
* @param payload
|
||||||
*/
|
*/
|
||||||
public Map<String, String> getQueryStringParams()
|
public void addPayload(byte[] payload)
|
||||||
|
{
|
||||||
|
this.bytePayload = payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a {@link ParameterList} with the query string parameters.
|
||||||
|
*
|
||||||
|
* @return a {@link ParameterList} containing the query string parameters.
|
||||||
|
* @throws OAuthException if the request URL is not valid.
|
||||||
|
*/
|
||||||
|
public ParameterList getQueryStringParams()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
ParameterList result = new ParameterList();
|
||||||
String query = new URL(url).getQuery();
|
String queryString = new URL(url).getQuery();
|
||||||
if (query != null)
|
result.addQuerystring(queryString);
|
||||||
{
|
result.addAll(querystringParams);
|
||||||
for (String param : query.split("&"))
|
return result;
|
||||||
{
|
}
|
||||||
String pair[] = param.split("=");
|
catch (MalformedURLException mue)
|
||||||
params.put(pair[0], pair[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return params;
|
|
||||||
} catch (MalformedURLException mue)
|
|
||||||
{
|
{
|
||||||
throw new OAuthException("Malformed URL", mue);
|
throw new OAuthException("Malformed URL", mue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains a {@link Map} of the body parameters.
|
* Obtains a {@link ParameterList} of the body parameters.
|
||||||
*
|
*
|
||||||
* @return a map containing the body parameters.
|
* @return a {@link ParameterList}containing the body parameters.
|
||||||
*/
|
*/
|
||||||
public Map<String, String> getBodyParams()
|
public ParameterList getBodyParams()
|
||||||
{
|
{
|
||||||
return bodyParams;
|
return bodyParams;
|
||||||
}
|
}
|
||||||
@@ -186,10 +243,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 : bodyParams.asFormUrlEncodedString();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return body.getBytes(getCharset());
|
||||||
|
}
|
||||||
|
catch(UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Unsupported Charset: "+getCharset(), uee);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -213,15 +292,60 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the connection timeout in milliseconds for the underlying {@link HttpURLConnection}
|
* Returns the connection charset. Defaults to {@link Charset} defaultCharset if not set
|
||||||
*
|
*
|
||||||
* @param timeout in milliseconds
|
* @return charset
|
||||||
*/
|
*/
|
||||||
public void setTimeout(int timeout)
|
public String getCharset()
|
||||||
{
|
{
|
||||||
this.timeout = timeout;
|
return charset == null ? Charset.defaultCharset().name() : charset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the connect timeout for the underlying {@link HttpURLConnection}
|
||||||
|
*
|
||||||
|
* @param duration duration of the timeout
|
||||||
|
*
|
||||||
|
* @param unit unit of time (milliseconds, seconds, etc)
|
||||||
|
*/
|
||||||
|
public void setConnectTimeout(int duration, TimeUnit unit)
|
||||||
|
{
|
||||||
|
this.connectTimeout = unit.toMillis(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the read timeout for the underlying {@link HttpURLConnection}
|
||||||
|
*
|
||||||
|
* @param duration duration of the timeout
|
||||||
|
*
|
||||||
|
* @param unit unit of time (milliseconds, seconds, etc)
|
||||||
|
*/
|
||||||
|
public void setReadTimeout(int duration, TimeUnit unit)
|
||||||
|
{
|
||||||
|
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 whether 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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need this in order to stub the connection object for test cases
|
* We need this in order to stub the connection object for test cases
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import org.scribe.utils.*;
|
|||||||
*/
|
*/
|
||||||
public class Response
|
public class Response
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String EMPTY = "";
|
private static final String EMPTY = "";
|
||||||
|
|
||||||
private int code;
|
private int code;
|
||||||
@@ -28,11 +27,12 @@ public class Response
|
|||||||
connection.connect();
|
connection.connect();
|
||||||
code = connection.getResponseCode();
|
code = connection.getResponseCode();
|
||||||
headers = parseHeaders(connection);
|
headers = parseHeaders(connection);
|
||||||
stream = wasSuccessful() ? connection.getInputStream() : connection.getErrorStream();
|
stream = isSuccessful() ? connection.getInputStream() : connection.getErrorStream();
|
||||||
} catch (UnknownHostException e)
|
}
|
||||||
|
catch (UnknownHostException e)
|
||||||
{
|
{
|
||||||
code = 404;
|
code = 404;
|
||||||
body = EMPTY;
|
body = Response.EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,12 +52,7 @@ public class Response
|
|||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public boolean isSuccessful()
|
||||||
* Checks if the code is in the successful or redirect range.
|
|
||||||
*
|
|
||||||
* @return true if successful
|
|
||||||
*/
|
|
||||||
private boolean wasSuccessful()
|
|
||||||
{
|
{
|
||||||
return getCode() >= 200 && getCode() < 400;
|
return getCode() >= 200 && getCode() < 400;
|
||||||
}
|
}
|
||||||
@@ -106,10 +101,9 @@ public class Response
|
|||||||
/**
|
/**
|
||||||
* Obtains a single HTTP Header value, or null if undefined
|
* Obtains a single HTTP Header value, or null if undefined
|
||||||
*
|
*
|
||||||
* @param header
|
* @param name the header name.
|
||||||
* name
|
|
||||||
*
|
*
|
||||||
* @return header value or null
|
* @return header value or null.
|
||||||
*/
|
*/
|
||||||
public String getHeader(String name)
|
public String getHeader(String name)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.scribe.model;
|
||||||
|
|
||||||
|
public enum SignatureType
|
||||||
|
{
|
||||||
|
Header,
|
||||||
|
QueryString
|
||||||
|
}
|
||||||
@@ -1,15 +1,36 @@
|
|||||||
package org.scribe.model;
|
package org.scribe.model;
|
||||||
|
|
||||||
public class Token
|
import java.io.Serializable;
|
||||||
{
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an OAuth token (either request or access token) and its secret
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class Token implements Serializable
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 715000866082812683L;
|
||||||
|
|
||||||
private final String token;
|
private final String token;
|
||||||
private final String secret;
|
private final String secret;
|
||||||
|
private final String rawResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*
|
||||||
|
* @param token token value
|
||||||
|
* @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()
|
||||||
@@ -22,6 +43,15 @@ public class Token
|
|||||||
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,12 +1,25 @@
|
|||||||
package org.scribe.model;
|
package org.scribe.model;
|
||||||
|
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an OAuth verifier code.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class Verifier
|
public class Verifier
|
||||||
{
|
{
|
||||||
|
|
||||||
private final String value;
|
private final String value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*
|
||||||
|
* @param value verifier value
|
||||||
|
*/
|
||||||
public Verifier(String value)
|
public Verifier(String value)
|
||||||
{
|
{
|
||||||
|
Preconditions.checkNotNull(value, "Must provide a valid string as verifier");
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,86 +1,145 @@
|
|||||||
package org.scribe.oauth;
|
package org.scribe.oauth;
|
||||||
|
|
||||||
import org.scribe.extractors.*;
|
import java.util.*;
|
||||||
import org.scribe.model.*;
|
|
||||||
import org.scribe.services.*;
|
|
||||||
|
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OAuth 1.0a implementation of {@link OAuthService}
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class OAuth10aServiceImpl implements OAuthService
|
public class OAuth10aServiceImpl implements OAuthService
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String VERSION = "1.0";
|
private static final String VERSION = "1.0";
|
||||||
|
|
||||||
private OAuthConfig config;
|
private OAuthConfig config;
|
||||||
private SignatureService signatureService;
|
private DefaultApi10a api;
|
||||||
private TimestampService timestampService;
|
|
||||||
private BaseStringExtractor baseStringExtractor;
|
|
||||||
private HeaderExtractor headerExtractor;
|
|
||||||
private RequestTokenExtractor rtExtractor;
|
|
||||||
private AccessTokenExtractor atExtractor;
|
|
||||||
|
|
||||||
public OAuth10aServiceImpl(SignatureService signatureService, TimestampService timestampService, BaseStringExtractor baseStringExtractor,
|
/**
|
||||||
HeaderExtractor headerExtractor, RequestTokenExtractor rtExtractor, AccessTokenExtractor atExtractor, OAuthConfig config)
|
* Default constructor
|
||||||
|
*
|
||||||
|
* @param api OAuth1.0a api information
|
||||||
|
* @param config OAuth 1.0a configuration param object
|
||||||
|
*/
|
||||||
|
public OAuth10aServiceImpl(DefaultApi10a api, OAuthConfig config)
|
||||||
{
|
{
|
||||||
this.signatureService = signatureService;
|
this.api = api;
|
||||||
this.timestampService = timestampService;
|
|
||||||
this.baseStringExtractor = baseStringExtractor;
|
|
||||||
this.headerExtractor = headerExtractor;
|
|
||||||
this.rtExtractor = rtExtractor;
|
|
||||||
this.atExtractor = atExtractor;
|
|
||||||
this.config = config;
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Token getRequestToken()
|
public Token getRequestToken()
|
||||||
{
|
{
|
||||||
OAuthRequest request = new OAuthRequest(config.getRequestTokenVerb(), config.getRequestTokenEndpoint());
|
config.log("obtaining request token from " + api.getRequestTokenEndpoint());
|
||||||
|
OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
|
||||||
|
|
||||||
|
config.log("setting oauth_callback to " + config.getCallback());
|
||||||
|
request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback());
|
||||||
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
|
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
|
||||||
addOAuthHeader(request);
|
appendSignature(request);
|
||||||
|
|
||||||
|
config.log("sending request...");
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
return rtExtractor.extract(response.getBody());
|
String body = response.getBody();
|
||||||
|
|
||||||
|
config.log("response status code: " + response.getCode());
|
||||||
|
config.log("response body: " + body);
|
||||||
|
return api.getRequestTokenExtractor().extract(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addOAuthParams(OAuthRequest request, Token token)
|
private void addOAuthParams(OAuthRequest request, Token token)
|
||||||
{
|
{
|
||||||
request.addOAuthParameter(OAuthConstants.TIMESTAMP, timestampService.getTimestampInSeconds());
|
request.addOAuthParameter(OAuthConstants.TIMESTAMP, api.getTimestampService().getTimestampInSeconds());
|
||||||
request.addOAuthParameter(OAuthConstants.NONCE, timestampService.getNonce());
|
request.addOAuthParameter(OAuthConstants.NONCE, api.getTimestampService().getNonce());
|
||||||
request.addOAuthParameter(OAuthConstants.CONSUMER_KEY, config.getApiKey());
|
request.addOAuthParameter(OAuthConstants.CONSUMER_KEY, config.getApiKey());
|
||||||
request.addOAuthParameter(OAuthConstants.SIGN_METHOD, signatureService.getSignatureMethod());
|
request.addOAuthParameter(OAuthConstants.SIGN_METHOD, api.getSignatureService().getSignatureMethod());
|
||||||
request.addOAuthParameter(OAuthConstants.VERSION, getVersion());
|
request.addOAuthParameter(OAuthConstants.VERSION, getVersion());
|
||||||
request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback());
|
if(config.hasScope()) request.addOAuthParameter(OAuthConstants.SCOPE, config.getScope());
|
||||||
request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token));
|
request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token));
|
||||||
|
|
||||||
|
config.log("appended additional OAuth parameters: " + MapUtils.toString(request.getOauthParameters()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Token getAccessToken(Token requestToken, Verifier verifier)
|
public Token getAccessToken(Token requestToken, Verifier verifier)
|
||||||
{
|
{
|
||||||
OAuthRequest request = new OAuthRequest(config.getAccessTokenVerb(), config.getAccessTokenEndpoint());
|
config.log("obtaining access token from " + api.getAccessTokenEndpoint());
|
||||||
|
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
|
||||||
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
|
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
|
||||||
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
|
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
|
||||||
|
|
||||||
|
config.log("setting token to: " + requestToken + " and verifier to: " + verifier);
|
||||||
addOAuthParams(request, requestToken);
|
addOAuthParams(request, requestToken);
|
||||||
addOAuthHeader(request);
|
appendSignature(request);
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
return atExtractor.extract(response.getBody());
|
return api.getAccessTokenExtractor().extract(response.getBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public void signRequest(Token token, OAuthRequest request)
|
public void signRequest(Token token, OAuthRequest request)
|
||||||
{
|
{
|
||||||
|
config.log("signing request: " + request.getCompleteUrl());
|
||||||
request.addOAuthParameter(OAuthConstants.TOKEN, token.getToken());
|
request.addOAuthParameter(OAuthConstants.TOKEN, token.getToken());
|
||||||
|
|
||||||
|
config.log("setting token to: " + token);
|
||||||
addOAuthParams(request, token);
|
addOAuthParams(request, token);
|
||||||
addOAuthHeader(request);
|
appendSignature(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String getVersion()
|
public String getVersion()
|
||||||
{
|
{
|
||||||
return VERSION;
|
return VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return api.getAuthorizationUrl(requestToken);
|
||||||
|
}
|
||||||
|
|
||||||
private String getSignature(OAuthRequest request, Token token)
|
private String getSignature(OAuthRequest request, Token token)
|
||||||
{
|
{
|
||||||
String baseString = baseStringExtractor.extract(request);
|
config.log("generating signature...");
|
||||||
return signatureService.getSignature(baseString, config.getApiSecret(), token.getSecret());
|
String baseString = api.getBaseStringExtractor().extract(request);
|
||||||
|
String signature = api.getSignatureService().getSignature(baseString, config.getApiSecret(), token.getSecret());
|
||||||
|
|
||||||
|
config.log("base string is: " + baseString);
|
||||||
|
config.log("signature is: " + signature);
|
||||||
|
return signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addOAuthHeader(OAuthRequest request)
|
private void appendSignature(OAuthRequest request)
|
||||||
{
|
{
|
||||||
String oauthHeader = headerExtractor.extract(request);
|
switch (config.getSignatureType())
|
||||||
request.addHeader(OAuthConstants.HEADER, oauthHeader);
|
{
|
||||||
|
case Header:
|
||||||
|
config.log("using Http Header signature");
|
||||||
|
|
||||||
|
String oauthHeader = api.getHeaderExtractor().extract(request);
|
||||||
|
request.addHeader(OAuthConstants.HEADER, oauthHeader);
|
||||||
|
break;
|
||||||
|
case QueryString:
|
||||||
|
config.log("using Querystring signature");
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : request.getOauthParameters().entrySet())
|
||||||
|
{
|
||||||
|
request.addQuerystringParameter(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package org.scribe.oauth;
|
||||||
|
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class OAuth20ServiceImpl implements OAuthService
|
||||||
|
{
|
||||||
|
private static final String VERSION = "2.0";
|
||||||
|
|
||||||
|
private final DefaultApi20 api;
|
||||||
|
private final OAuthConfig config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*
|
||||||
|
* @param api OAuth2.0 api information
|
||||||
|
* @param config OAuth 2.0 configuration param object
|
||||||
|
*/
|
||||||
|
public OAuth20ServiceImpl(DefaultApi20 api, OAuthConfig config)
|
||||||
|
{
|
||||||
|
this.api = api;
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public Token getAccessToken(Token requestToken, Verifier verifier)
|
||||||
|
{
|
||||||
|
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public Token getRequestToken()
|
||||||
|
{
|
||||||
|
throw new UnsupportedOperationException("Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getVersion()
|
||||||
|
{
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public void signRequest(Token accessToken, OAuthRequest request)
|
||||||
|
{
|
||||||
|
request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getAuthorizationUrl(Token requestToken)
|
||||||
|
{
|
||||||
|
return api.getAuthorizationUrl(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,13 +2,52 @@ package org.scribe.oauth;
|
|||||||
|
|
||||||
import org.scribe.model.*;
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main Scribe object.
|
||||||
|
*
|
||||||
|
* A facade responsible for the retrieval of request and access tokens and for the signing of HTTP requests.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface OAuthService
|
public interface OAuthService
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Retrieve the request token.
|
||||||
|
*
|
||||||
|
* @return request token
|
||||||
|
*/
|
||||||
public Token getRequestToken();
|
public Token getRequestToken();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the access token
|
||||||
|
*
|
||||||
|
* @param requestToken request token (obtained previously)
|
||||||
|
* @param verifier verifier code
|
||||||
|
* @return access token
|
||||||
|
*/
|
||||||
public Token getAccessToken(Token requestToken, Verifier verifier);
|
public Token getAccessToken(Token requestToken, Verifier verifier);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signs am OAuth request
|
||||||
|
*
|
||||||
|
* @param accessToken access token (obtained previously)
|
||||||
|
* @param request request to sign
|
||||||
|
*/
|
||||||
public void signRequest(Token accessToken, OAuthRequest request);
|
public void signRequest(Token accessToken, OAuthRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the OAuth version of the service.
|
||||||
|
*
|
||||||
|
* @return oauth version as string
|
||||||
|
*/
|
||||||
public String getVersion();
|
public String getVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL where you should redirect your users to authenticate
|
||||||
|
* your application.
|
||||||
|
*
|
||||||
|
* @param requestToken the request token you need to authorize
|
||||||
|
* @return the URL where you should redirect your users
|
||||||
|
*/
|
||||||
|
public String getAuthorizationUrl(Token requestToken);
|
||||||
}
|
}
|
||||||
@@ -7,22 +7,30 @@ import org.apache.commons.codec.binary.*;
|
|||||||
import org.scribe.exceptions.*;
|
import org.scribe.exceptions.*;
|
||||||
import org.scribe.utils.*;
|
import org.scribe.utils.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HMAC-SHA1 implementation of {@SignatureService}
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class HMACSha1SignatureService implements SignatureService
|
public class HMACSha1SignatureService implements SignatureService
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String EMPTY_STRING = "";
|
private static final String EMPTY_STRING = "";
|
||||||
private static final String CARRIAGE_RETURN = "\r\n";
|
private static final String CARRIAGE_RETURN = "\r\n";
|
||||||
private static final String UTF8 = "UTF-8";
|
private static final String UTF8 = "UTF-8";
|
||||||
private static final String HMAC_SHA1 = "HmacSHA1";
|
private static final String HMAC_SHA1 = "HmacSHA1";
|
||||||
private static final String METHOD = "HMAC-SHA1";
|
private static final String METHOD = "HMAC-SHA1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String getSignature(String baseString, String apiSecret, String tokenSecret)
|
public String getSignature(String baseString, String apiSecret, String tokenSecret)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Preconditions.checkEmptyString(baseString, "Base string cant be null or empty string");
|
Preconditions.checkEmptyString(baseString, "Base string cant be null or empty string");
|
||||||
Preconditions.checkEmptyString(apiSecret, "Api secret cant be null or empty string");
|
Preconditions.checkEmptyString(apiSecret, "Api secret cant be null or empty string");
|
||||||
return doSign(baseString, apiSecret + '&' + tokenSecret);
|
return doSign(baseString, OAuthEncoder.encode(apiSecret) + '&' + OAuthEncoder.encode(tokenSecret));
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -39,6 +47,9 @@ public class HMACSha1SignatureService implements SignatureService
|
|||||||
return new String(Base64.encodeBase64(bytes)).replace(CARRIAGE_RETURN, EMPTY_STRING);
|
return new String(Base64.encodeBase64(bytes)).replace(CARRIAGE_RETURN, EMPTY_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String getSignatureMethod()
|
public String getSignatureMethod()
|
||||||
{
|
{
|
||||||
return METHOD;
|
return METHOD;
|
||||||
|
|||||||
@@ -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 OAuthEncoder.encode(apiSecret) + '&' + OAuthEncoder.encode(tokenSecret);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new OAuthSignatureException(baseString, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public String getSignatureMethod()
|
||||||
|
{
|
||||||
|
return METHOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,8 +1,28 @@
|
|||||||
package org.scribe.services;
|
package org.scribe.services;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signs a base string, returning the OAuth signature
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*
|
||||||
|
*/
|
||||||
public interface SignatureService
|
public interface SignatureService
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Returns the signature
|
||||||
|
*
|
||||||
|
* @param baseString url-encoded string to sign
|
||||||
|
* @param apiSecret api secret for your app
|
||||||
|
* @param tokenSecret token secret (empty string for the request token step)
|
||||||
|
*
|
||||||
|
* @return signature
|
||||||
|
*/
|
||||||
public String getSignature(String baseString, String apiSecret, String tokenSecret);
|
public String getSignature(String baseString, String apiSecret, String tokenSecret);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the signature method/algorithm
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public String getSignatureMethod();
|
public String getSignatureMethod();
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,25 @@
|
|||||||
package org.scribe.services;
|
package org.scribe.services;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unix epoch timestamp generator.
|
||||||
|
*
|
||||||
|
* This class is useful for stubbing in tests.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public interface TimestampService
|
public interface TimestampService
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Returns the unix epoch timestamp in seconds
|
||||||
|
*
|
||||||
|
* @return timestamp
|
||||||
|
*/
|
||||||
public String getTimestampInSeconds();
|
public String getTimestampInSeconds();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a nonce (unique value for each request)
|
||||||
|
*
|
||||||
|
* @return nonce
|
||||||
|
*/
|
||||||
public String getNonce();
|
public String getNonce();
|
||||||
}
|
}
|
||||||
@@ -2,22 +2,35 @@ package org.scribe.services;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of {@link TimestampService} using plain java classes.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class TimestampServiceImpl implements TimestampService
|
public class TimestampServiceImpl implements TimestampService
|
||||||
{
|
{
|
||||||
|
|
||||||
private Timer timer;
|
private Timer timer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
public TimestampServiceImpl()
|
public TimestampServiceImpl()
|
||||||
{
|
{
|
||||||
timer = new Timer();
|
timer = new Timer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String getNonce()
|
public String getNonce()
|
||||||
{
|
{
|
||||||
Long ts = getTs();
|
Long ts = getTs();
|
||||||
return String.valueOf(ts + timer.getRandomInteger());
|
return String.valueOf(ts + timer.getRandomInteger());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public String getTimestampInSeconds()
|
public String getTimestampInSeconds()
|
||||||
{
|
{
|
||||||
return String.valueOf(getTs());
|
return String.valueOf(getTs());
|
||||||
@@ -33,14 +46,19 @@ public class TimestampServiceImpl implements TimestampService
|
|||||||
this.timer = timer;
|
this.timer = timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inner class that uses {@link System} for generating the timestamps.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
static class Timer
|
static class Timer
|
||||||
{
|
{
|
||||||
public Long getMilis()
|
Long getMilis()
|
||||||
{
|
{
|
||||||
return System.currentTimeMillis();
|
return System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getRandomInteger()
|
Integer getRandomInteger()
|
||||||
{
|
{
|
||||||
return new Random().nextInt();
|
return new Random().nextInt();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,22 @@
|
|||||||
package org.scribe.utils;
|
package org.scribe.utils;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
public class MapUtils
|
public class MapUtils
|
||||||
{
|
{
|
||||||
|
public static <K,V> String toString(Map<K,V> map)
|
||||||
public static final Map<String, String> sort(Map<String, String> map)
|
|
||||||
{
|
{
|
||||||
Preconditions.checkNotNull(map, "Cannot sort a null object.");
|
if (map == null) return "";
|
||||||
|
if (map.isEmpty()) return "{}";
|
||||||
|
|
||||||
Map<String, String> sorted = new LinkedHashMap<String, String>();
|
StringBuilder result = new StringBuilder();
|
||||||
for (String key : getSortedKeys(map))
|
for(Map.Entry<K,V> entry : map.entrySet())
|
||||||
{
|
{
|
||||||
sorted.put(key, map.get(key));
|
result.append(String.format(", %s -> %s ", entry.getKey().toString(), entry.getValue().toString()));
|
||||||
}
|
}
|
||||||
return sorted;
|
return "{" + result.substring(1) + "}";
|
||||||
}
|
|
||||||
|
|
||||||
private static List<String> getSortedKeys(Map<String, String> map)
|
|
||||||
{
|
|
||||||
List<String> keys = new ArrayList<String>(map.keySet());
|
|
||||||
Collections.sort(keys);
|
|
||||||
return keys;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package org.scribe.utils;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.*;
|
||||||
|
import org.scribe.exceptions.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class OAuthEncoder
|
||||||
|
{
|
||||||
|
private static String CHARSET = "UTF-8";
|
||||||
|
private static final Map<String, String> ENCODING_RULES;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
Map<String, String> rules = new HashMap<String, String>();
|
||||||
|
rules.put("*", "%2A");
|
||||||
|
rules.put("+", "%20");
|
||||||
|
rules.put("%7E", "~");
|
||||||
|
ENCODING_RULES = Collections.unmodifiableMap(rules);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encode(String plain)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(plain, "Cannot encode null object");
|
||||||
|
String encoded = "";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
encoded = URLEncoder.encode(plain, CHARSET);
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Charset not found while encoding string: " + CHARSET, uee);
|
||||||
|
}
|
||||||
|
for(Map.Entry<String, String> rule : ENCODING_RULES.entrySet())
|
||||||
|
{
|
||||||
|
encoded = applyRule(encoded, rule.getKey(), rule.getValue());
|
||||||
|
}
|
||||||
|
return encoded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String applyRule(String encoded, String toReplace, String replacement)
|
||||||
|
{
|
||||||
|
return encoded.replaceAll(Pattern.quote(toReplace), replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decode(String encoded)
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull(encoded, "Cannot decode null object");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return URLDecoder.decode(encoded, CHARSET);
|
||||||
|
}
|
||||||
|
catch(UnsupportedEncodingException uee)
|
||||||
|
{
|
||||||
|
throw new OAuthException("Charset not found while decoding string: " + CHARSET, uee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,63 @@
|
|||||||
package org.scribe.utils;
|
package org.scribe.utils;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.scribe.model.OAuthConstants;
|
import org.scribe.model.OAuthConstants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utils for checking preconditions and invariants
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class Preconditions
|
public class Preconditions
|
||||||
{
|
{
|
||||||
private static final String DEFAULT_MESSAGE = "Received an invalid parameter";
|
private static final String DEFAULT_MESSAGE = "Received an invalid parameter";
|
||||||
|
private static final Pattern URL_PATTERN = Pattern.compile("[a-zA-Z_-]+://\\S+");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that an object is not null.
|
||||||
|
*
|
||||||
|
* @param object any object
|
||||||
|
* @param errorMsg error message
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if the object is null
|
||||||
|
*/
|
||||||
public static void checkNotNull(Object object, String errorMsg)
|
public static void checkNotNull(Object object, String errorMsg)
|
||||||
{
|
{
|
||||||
check(object != null, errorMsg);
|
check(object != null, errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that a string is not null or empty
|
||||||
|
*
|
||||||
|
* @param string any string
|
||||||
|
* @param errorMsg error message
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if the string is null or empty
|
||||||
|
*/
|
||||||
public static void checkEmptyString(String string, String errorMsg)
|
public static void checkEmptyString(String string, String errorMsg)
|
||||||
{
|
{
|
||||||
check(string != null && !string.trim().equals(""), errorMsg);
|
check(string != null && !string.trim().equals(""), errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that a URL is valid
|
||||||
|
*
|
||||||
|
* @param url any string
|
||||||
|
* @param errorMsg error message
|
||||||
|
*/
|
||||||
public static void checkValidUrl(String url, String errorMsg)
|
public static void checkValidUrl(String url, String errorMsg)
|
||||||
{
|
{
|
||||||
checkEmptyString(url, errorMsg);
|
checkEmptyString(url, errorMsg);
|
||||||
check(isUrl(url), errorMsg);
|
check(isUrl(url), errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that a URL is a valid OAuth callback
|
||||||
|
*
|
||||||
|
* @param url any string
|
||||||
|
* @param errorMsg error message
|
||||||
|
*/
|
||||||
public static void checkValidOAuthCallback(String url, String errorMsg)
|
public static void checkValidOAuthCallback(String url, String errorMsg)
|
||||||
{
|
{
|
||||||
checkEmptyString(url, errorMsg);
|
checkEmptyString(url, errorMsg);
|
||||||
@@ -31,9 +67,9 @@ public class Preconditions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isUrl(String url)
|
private static boolean isUrl(String url)
|
||||||
{
|
{
|
||||||
return url.startsWith("http://") || url.startsWith("https://");
|
return URL_PATTERN.matcher(url).matches();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void check(boolean requirements, String error)
|
private static void check(boolean requirements, String error)
|
||||||
|
|||||||
@@ -2,9 +2,19 @@ package org.scribe.utils;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utils to deal with Streams.
|
||||||
|
*
|
||||||
|
* @author Pablo Fernandez
|
||||||
|
*/
|
||||||
public class StreamUtils
|
public class StreamUtils
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Returns the stream contents as an UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* @param is input stream
|
||||||
|
* @return string contents
|
||||||
|
*/
|
||||||
public static String getStreamContents(InputStream is)
|
public static String getStreamContents(InputStream is)
|
||||||
{
|
{
|
||||||
Preconditions.checkNotNull(is, "Cannot get String from a null object");
|
Preconditions.checkNotNull(is, "Cannot get String from a null object");
|
||||||
@@ -26,7 +36,7 @@ public class StreamUtils
|
|||||||
return out.toString();
|
return out.toString();
|
||||||
} catch (IOException ioe)
|
} catch (IOException ioe)
|
||||||
{
|
{
|
||||||
throw new RuntimeException("Error while reading response body", ioe);
|
throw new IllegalStateException("Error while reading response body", ioe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
package org.scribe.utils;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import org.scribe.exceptions.*;
|
|
||||||
|
|
||||||
public class URLUtils
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final String EMPTY_STRING = "";
|
|
||||||
private static final String UTF_8 = "UTF-8";
|
|
||||||
private static final char PAIR_SEPARATOR = '=';
|
|
||||||
private static final char PARAM_SEPARATOR = '&';
|
|
||||||
|
|
||||||
private static final String ERROR_MSG = String.format("Cannot find specified encoding: %s", UTF_8);
|
|
||||||
|
|
||||||
public static String formURLEncodeMap(Map<String, String> map)
|
|
||||||
{
|
|
||||||
Preconditions.checkNotNull(map, "Cannot url-encode a null object");
|
|
||||||
return (map.size() <= 0) ? EMPTY_STRING : doFormUrlEncode(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String doFormUrlEncode(Map<String, String> map)
|
|
||||||
{
|
|
||||||
StringBuffer encodedString = new StringBuffer(map.size() * 20);
|
|
||||||
for (String key : map.keySet())
|
|
||||||
{
|
|
||||||
if(encodedString.length() > 0)
|
|
||||||
{
|
|
||||||
encodedString.append(PARAM_SEPARATOR);
|
|
||||||
}
|
|
||||||
encodedString.append(percentEncode(key)).append(PAIR_SEPARATOR).append(percentEncode(map.get(key)));
|
|
||||||
}
|
|
||||||
return encodedString.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String percentEncode(String string)
|
|
||||||
{
|
|
||||||
Preconditions.checkNotNull(string, "Cannot encode null string");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return URLEncoder.encode(string, UTF_8).replaceAll("\\+", "%20");
|
|
||||||
}
|
|
||||||
catch (UnsupportedEncodingException uee)
|
|
||||||
{
|
|
||||||
throw new OAuthException(ERROR_MSG, uee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String percentDecode(String string)
|
|
||||||
{
|
|
||||||
Preconditions.checkNotNull(string, "Cannot decode null string");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return URLDecoder.decode(string, UTF_8);
|
|
||||||
} catch (UnsupportedEncodingException uee)
|
|
||||||
{
|
|
||||||
throw new OAuthException(ERROR_MSG, uee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package org.scribe.builder;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.*;
|
||||||
|
import org.scribe.builder.api.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
import org.scribe.oauth.*;
|
||||||
|
|
||||||
|
public class ServiceBuilderTest
|
||||||
|
{
|
||||||
|
private ServiceBuilder builder;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup()
|
||||||
|
{
|
||||||
|
builder = new ServiceBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldReturnConfigDefaultValues()
|
||||||
|
{
|
||||||
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").build();
|
||||||
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
|
assertEquals(ApiMock.config.getCallback(), OAuthConstants.OUT_OF_BAND);
|
||||||
|
assertEquals(ApiMock.config.getSignatureType(), SignatureType.Header);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAcceptValidCallbackUrl()
|
||||||
|
{
|
||||||
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").callback("http://example.com").build();
|
||||||
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
|
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)
|
||||||
|
public void shouldNotAcceptAnInvalidUrlAsCallback()
|
||||||
|
{
|
||||||
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").callback("example.com").build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAcceptAnScope()
|
||||||
|
{
|
||||||
|
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").scope("rss-api").build();
|
||||||
|
assertEquals(ApiMock.config.getApiKey(), "key");
|
||||||
|
assertEquals(ApiMock.config.getApiSecret(), "secret");
|
||||||
|
assertEquals(ApiMock.config.getScope(), "rss-api");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ApiMock implements Api
|
||||||
|
{
|
||||||
|
public static OAuthConfig config;
|
||||||
|
|
||||||
|
public OAuthService createService(OAuthConfig config)
|
||||||
|
{
|
||||||
|
ApiMock.config = config;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 FacebookExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "Facebook";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://graph.facebook.com/me";
|
||||||
|
private static final Token EMPTY_TOKEN = null;
|
||||||
|
|
||||||
|
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";
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(FacebookApi.class)
|
||||||
|
.apiKey(apiKey)
|
||||||
|
.apiSecret(apiSecret)
|
||||||
|
.callback("http://www.example.com/oauth_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,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! :)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@ import org.scribe.oauth.*;
|
|||||||
|
|
||||||
public class FoursquareExample
|
public class FoursquareExample
|
||||||
{
|
{
|
||||||
private static final String AUTHORIZE_URL = "http://foursquare.com/oauth/authorize?oauth_token=";
|
|
||||||
private static final String PROTECTED_RESOURCE_URL = "http://api.foursquare.com/v1/user";
|
private static final String PROTECTED_RESOURCE_URL = "http://api.foursquare.com/v1/user";
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
@@ -31,7 +30,7 @@ public class FoursquareExample
|
|||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
System.out.println("Now go and authorize Scribe here:");
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
System.out.println(AUTHORIZE_URL + requestToken.getToken());
|
System.out.println(service.getAuthorizationUrl(requestToken));
|
||||||
System.out.println("And paste the verifier here");
|
System.out.println("And paste the verifier here");
|
||||||
System.out.print(">>");
|
System.out.print(">>");
|
||||||
Verifier verifier = new Verifier(in.nextLine());
|
Verifier verifier = new Verifier(in.nextLine());
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
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 GoogleExample
|
||||||
|
{
|
||||||
|
private static final String NETWORK_NAME = "Google";
|
||||||
|
private static final String AUTHORIZE_URL = "https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=";
|
||||||
|
private static final String PROTECTED_RESOURCE_URL = "https://docs.google.com/feeds/default/private/full/";
|
||||||
|
private static final String SCOPE = "https://docs.google.com/feeds/";
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
OAuthService service = new ServiceBuilder()
|
||||||
|
.provider(GoogleApi.class)
|
||||||
|
.apiKey("anonymous")
|
||||||
|
.apiSecret("anonymous")
|
||||||
|
.scope(SCOPE)
|
||||||
|
.build();
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
|
System.out.println("=== " + NETWORK_NAME + "'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("(if your curious it looks like this: " + requestToken + " )");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
|
System.out.println(AUTHORIZE_URL + requestToken.getToken());
|
||||||
|
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.GET, PROTECTED_RESOURCE_URL);
|
||||||
|
service.signRequest(accessToken, request);
|
||||||
|
request.addHeader("GData-Version", "3.0");
|
||||||
|
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! :)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,18 +9,17 @@ import org.scribe.oauth.*;
|
|||||||
|
|
||||||
public class LinkedInExample
|
public class LinkedInExample
|
||||||
{
|
{
|
||||||
private static final String AUTHORIZE_URL = "https://api.linkedin.com/uas/oauth/authorize?oauth_token=";
|
|
||||||
private static final String PROTECTED_RESOURCE_URL = "http://api.linkedin.com/v1/people/~/connections:(id,last-name)";
|
private static final String PROTECTED_RESOURCE_URL = "http://api.linkedin.com/v1/people/~/connections:(id,last-name)";
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
OAuthService service = new ServiceBuilder()
|
OAuthService service = new ServiceBuilder()
|
||||||
.provider(LinkedInApi.class)
|
.provider(LinkedInApi.class)
|
||||||
.apiKey("CiEgwWDkA5BFpNrc0RfGyVuSlOh4tig5kOTZ9q97qcXNrFl7zqk-Ts7DqRGaKDCV")
|
.apiKey("CiEgwWDkA5BFpNrc0RfGyVuSlOh4tig5kOTZ9q97qcXNrFl7zqk-Ts7DqRGaKDCV")
|
||||||
.apiSecret("dhho4dfoCmiQXrkw4yslork5XWLFnPSuMR-8gscPVjY4jqFFHPYWJKgpFl4uLTM6")
|
.apiSecret("dhho4dfoCmiQXrkw4yslork5XWLFnPSuMR-8gscPVjY4jqFFHPYWJKgpFl4uLTM6")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Scanner in = new Scanner(System.in);
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
System.out.println("=== LinkedIn's OAuth Workflow ===");
|
System.out.println("=== LinkedIn's OAuth Workflow ===");
|
||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
@@ -31,7 +30,7 @@ public class LinkedInExample
|
|||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
System.out.println("Now go and authorize Scribe here:");
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
System.out.println(AUTHORIZE_URL + requestToken.getToken());
|
System.out.println(service.getAuthorizationUrl(requestToken));
|
||||||
System.out.println("And paste the verifier here");
|
System.out.println("And paste the verifier here");
|
||||||
System.out.print(">>");
|
System.out.print(">>");
|
||||||
Verifier verifier = new Verifier(in.nextLine());
|
Verifier verifier = new Verifier(in.nextLine());
|
||||||
@@ -55,8 +54,6 @@ public class LinkedInExample
|
|||||||
|
|
||||||
System.out.println();
|
System.out.println();
|
||||||
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");
|
||||||
|
|
||||||
System.out.println(service.getRequestToken());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,8 +9,7 @@ import org.scribe.oauth.*;
|
|||||||
|
|
||||||
public class TwitterExample
|
public class TwitterExample
|
||||||
{
|
{
|
||||||
private static final String AUTHORIZE_URL = "https://twitter.com/oauth/authorize?oauth_token=";
|
private static final String PROTECTED_RESOURCE_URL = "https://api.twitter.com/1/statuses/update.json";
|
||||||
private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1/account/verify_credentials.xml";
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
@@ -31,7 +30,7 @@ public class TwitterExample
|
|||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
System.out.println("Now go and authorize Scribe here:");
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
System.out.println(AUTHORIZE_URL + requestToken.getToken());
|
System.out.println(service.getAuthorizationUrl(requestToken));
|
||||||
System.out.println("And paste the verifier here");
|
System.out.println("And paste the verifier here");
|
||||||
System.out.print(">>");
|
System.out.print(">>");
|
||||||
Verifier verifier = new Verifier(in.nextLine());
|
Verifier verifier = new Verifier(in.nextLine());
|
||||||
@@ -46,7 +45,8 @@ public class TwitterExample
|
|||||||
|
|
||||||
// Now let's go and ask for a protected resource!
|
// Now let's go and ask for a protected resource!
|
||||||
System.out.println("Now we're going to access a protected resource...");
|
System.out.println("Now we're going to access a protected resource...");
|
||||||
OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
|
OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL);
|
||||||
|
request.addBodyParameter("status", "this is sparta! *");
|
||||||
service.signRequest(accessToken, request);
|
service.signRequest(accessToken, request);
|
||||||
Response response = request.send();
|
Response response = request.send();
|
||||||
System.out.println("Got it! Lets see what we found...");
|
System.out.println("Got it! Lets see what we found...");
|
||||||
|
|||||||
@@ -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! :)");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,20 +9,18 @@ import org.scribe.oauth.*;
|
|||||||
|
|
||||||
public class YahooExample
|
public class YahooExample
|
||||||
{
|
{
|
||||||
private static final String NETWORK_NAME = "Yahoo";
|
|
||||||
private static final String AUTHORIZE_URL = "https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token=";
|
|
||||||
private static final String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/A6ROU63MXWDCW3Y5MGCYWVHDJI/profile/status?format=json";
|
private static final String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/A6ROU63MXWDCW3Y5MGCYWVHDJI/profile/status?format=json";
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
OAuthService service = new ServiceBuilder()
|
OAuthService service = new ServiceBuilder()
|
||||||
.provider(YahooApi.class)
|
.provider(YahooApi.class)
|
||||||
.apiKey("dj0yJmk9TXZDWVpNVVdGaVFmJmQ9WVdrOWMweHZXbkZLTkhVbWNHbzlNVEl5TWprd05qUTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0wMw--")
|
.apiKey("dj0yJmk9TXZDWVpNVVdGaVFmJmQ9WVdrOWMweHZXbkZLTkhVbWNHbzlNVEl5TWprd05qUTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0wMw--")
|
||||||
.apiSecret("262be559f92a2be20c4c039419018f2b48cdfce9")
|
.apiSecret("262be559f92a2be20c4c039419018f2b48cdfce9")
|
||||||
.build();
|
.build();
|
||||||
Scanner in = new Scanner(System.in);
|
Scanner in = new Scanner(System.in);
|
||||||
|
|
||||||
System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
|
System.out.println("=== Yahoo's OAuth Workflow ===");
|
||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
// Obtain the Request Token
|
// Obtain the Request Token
|
||||||
@@ -32,7 +30,7 @@ public class YahooExample
|
|||||||
System.out.println();
|
System.out.println();
|
||||||
|
|
||||||
System.out.println("Now go and authorize Scribe here:");
|
System.out.println("Now go and authorize Scribe here:");
|
||||||
System.out.println(AUTHORIZE_URL + requestToken.getToken());
|
System.out.println(service.getAuthorizationUrl(requestToken));
|
||||||
System.out.println("And paste the verifier here");
|
System.out.println("And paste the verifier here");
|
||||||
System.out.print(">>");
|
System.out.print(">>");
|
||||||
Verifier verifier = new Verifier(in.nextLine());
|
Verifier verifier = new Verifier(in.nextLine());
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class BaseStringExtractorTest
|
|||||||
@Test
|
@Test
|
||||||
public void shouldExtractBaseStringFromOAuthRequest()
|
public void shouldExtractBaseStringFromOAuthRequest()
|
||||||
{
|
{
|
||||||
String expected = "GET&http%3A%2F%2Fexample.com&oauth_callback%3Dhttp%253A%252F%252Fexample%252Fcallback%26oauth_consumer_key%3DAS%2523%2524%255E*%2540%2526%26oauth_signature%3DOAuth-Signature%26oauth_timestamp%3D123456";
|
String expected = "GET&http%3A%2F%2Fexample.com&oauth_callback%3Dhttp%253A%252F%252Fexample%252Fcallback%26oauth_consumer_key%3DAS%2523%2524%255E%252A%2540%2526%26oauth_signature%3DOAuth-Signature%26oauth_timestamp%3D123456";
|
||||||
String baseString = extractor.extract(request);
|
String baseString = extractor.extract(request);
|
||||||
assertEquals(expected, baseString);
|
assertEquals(expected, baseString);
|
||||||
}
|
}
|
||||||
@@ -41,11 +41,11 @@ public class BaseStringExtractorTest
|
|||||||
OAuthRequest request = new OAuthRequest(Verb.GET, "http://example.com");
|
OAuthRequest request = new OAuthRequest(Verb.GET, "http://example.com");
|
||||||
extractor.extract(request);
|
extractor.extract(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldProperlyEncodeSpaces()
|
public void shouldProperlyEncodeSpaces()
|
||||||
{
|
{
|
||||||
String expected = "GET&http%3A%2F%2Fexample.com&body%3Dthis%2520param%2520has%2520whitespace%26oauth_callback%3Dhttp%253A%252F%252Fexample%252Fcallback%26oauth_consumer_key%3DAS%2523%2524%255E*%2540%2526%26oauth_signature%3DOAuth-Signature%26oauth_timestamp%3D123456";
|
String expected = "GET&http%3A%2F%2Fexample.com&body%3Dthis%2520param%2520has%2520whitespace%26oauth_callback%3Dhttp%253A%252F%252Fexample%252Fcallback%26oauth_consumer_key%3DAS%2523%2524%255E%252A%2540%2526%26oauth_signature%3DOAuth-Signature%26oauth_timestamp%3D123456";
|
||||||
request.addBodyParameter("body", "this param has whitespace");
|
request.addBodyParameter("body", "this param has whitespace");
|
||||||
assertEquals(expected, extractor.extract(request));
|
assertEquals(expected, extractor.extract(request));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class HeaderExtractorTest
|
|||||||
public void shouldExtractStandardHeader()
|
public void shouldExtractStandardHeader()
|
||||||
{
|
{
|
||||||
String expected = "OAuth oauth_callback=\"http%3A%2F%2Fexample%2Fcallback\", " + "oauth_signature=\"OAuth-Signature\", "
|
String expected = "OAuth oauth_callback=\"http%3A%2F%2Fexample%2Fcallback\", " + "oauth_signature=\"OAuth-Signature\", "
|
||||||
+ "oauth_consumer_key=\"AS%23%24%5E*%40%26\", " + "oauth_timestamp=\"123456\"";
|
+ "oauth_consumer_key=\"AS%23%24%5E%2A%40%26\", " + "oauth_timestamp=\"123456\"";
|
||||||
String header = extractor.extract(request);
|
String header = extractor.extract(request);
|
||||||
assertEquals(expected, header);
|
assertEquals(expected, header);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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("");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package org.scribe.extractors;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.*;
|
||||||
|
import org.scribe.exceptions.*;
|
||||||
|
import org.scribe.model.*;
|
||||||
|
|
||||||
|
public class TokenExtractor20Test
|
||||||
|
{
|
||||||
|
|
||||||
|
private TokenExtractor20Impl extractor;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup()
|
||||||
|
{
|
||||||
|
extractor = new TokenExtractor20Impl();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExtractTokenFromOAuthStandardResponse()
|
||||||
|
{
|
||||||
|
String response = "access_token=166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE";
|
||||||
|
Token extracted = extractor.extract(response);
|
||||||
|
assertEquals("166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE", extracted.getToken());
|
||||||
|
assertEquals("", extracted.getSecret());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExtractTokenFromResponseWithExpiresParam()
|
||||||
|
{
|
||||||
|
String response = "access_token=166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE&expires=5108";
|
||||||
|
Token extracted = extractor.extract(response);
|
||||||
|
assertEquals("166942940015970|2.2ltzWXYNDjCtg5ZDVVJJeg__.3600.1295816400-548517159|RsXNdKrpxg8L6QNLWcs2TVTmcaE", extracted.getToken());
|
||||||
|
assertEquals("", extracted.getSecret());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExtractTokenFromResponseWithManyParameters()
|
||||||
|
{
|
||||||
|
String response = "access_token=foo1234&other_stuff=yeah_we_have_this_too&number=42";
|
||||||
|
Token extracted = extractor.extract(response);
|
||||||
|
assertEquals("foo1234", extracted.getToken());
|
||||||
|
assertEquals("", extracted.getSecret());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = OAuthException.class)
|
||||||
|
public void shouldThrowExceptionIfTokenIsAbsent()
|
||||||
|
{
|
||||||
|
String response = "&expires=5108";
|
||||||
|
extractor.extract(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfResponseIsNull()
|
||||||
|
{
|
||||||
|
String response = null;
|
||||||
|
extractor.extract(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfResponseIsEmptyString()
|
||||||
|
{
|
||||||
|
String response = "";
|
||||||
|
extractor.extract(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ public class ConnectionStub extends HttpURLConnection
|
|||||||
headers.put(key, value);
|
headers.put(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRequestProperty(String s)
|
||||||
|
{
|
||||||
|
return headers.get(s);
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, String> getHeaders()
|
public Map<String, String> getHeaders()
|
||||||
{
|
{
|
||||||
return headers;
|
return headers;
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package org.scribe.model;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import org.junit.*;
|
|
||||||
|
|
||||||
public class OAuthConfigTest
|
|
||||||
{
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldReturnDefaultValuesIfNotSet()
|
|
||||||
{
|
|
||||||
OAuthConfig config = new OAuthConfig();
|
|
||||||
assertEquals(Verb.GET, config.getAccessTokenVerb());
|
|
||||||
assertEquals(Verb.GET, config.getRequestTokenVerb());
|
|
||||||
assertEquals(OAuthConstants.OUT_OF_BAND, config.getCallback());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldOverrideDefaultsIfSet()
|
|
||||||
{
|
|
||||||
OAuthConfig config = new OAuthConfig();
|
|
||||||
config.setCallback("http://callback");
|
|
||||||
config.setAccessTokenVerb(Verb.POST);
|
|
||||||
config.setRequestTokenVerb(Verb.POST);
|
|
||||||
assertEquals("http://callback", config.getCallback());
|
|
||||||
assertEquals(Verb.POST, config.getAccessTokenVerb());
|
|
||||||
assertEquals(Verb.POST, config.getRequestTokenVerb());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -21,8 +21,9 @@ public class OAuthRequestTest
|
|||||||
request.addOAuthParameter(OAuthConstants.TOKEN, "token");
|
request.addOAuthParameter(OAuthConstants.TOKEN, "token");
|
||||||
request.addOAuthParameter(OAuthConstants.NONCE, "nonce");
|
request.addOAuthParameter(OAuthConstants.NONCE, "nonce");
|
||||||
request.addOAuthParameter(OAuthConstants.TIMESTAMP, "ts");
|
request.addOAuthParameter(OAuthConstants.TIMESTAMP, "ts");
|
||||||
|
request.addOAuthParameter(OAuthConstants.SCOPE, "feeds");
|
||||||
|
|
||||||
assertEquals(3, request.getOauthParameters().size());
|
assertEquals(4, request.getOauthParameters().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package org.scribe.model;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class ParameterListTest
|
||||||
|
{
|
||||||
|
private ParameterList params;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup()
|
||||||
|
{
|
||||||
|
this.params = new ParameterList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionWhenAppendingNullMapToQuerystring()
|
||||||
|
{
|
||||||
|
String url = null;
|
||||||
|
params.appendTo(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAppendNothingToQuerystringIfGivenEmptyMap()
|
||||||
|
{
|
||||||
|
String url = "http://www.example.com";
|
||||||
|
Assert.assertEquals(url, params.appendTo(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAppendParametersToSimpleUrl()
|
||||||
|
{
|
||||||
|
String url = "http://www.example.com";
|
||||||
|
String expectedUrl = "http://www.example.com?param1=value1¶m2=value%20with%20spaces";
|
||||||
|
|
||||||
|
params.add("param1", "value1");
|
||||||
|
params.add("param2", "value with spaces");
|
||||||
|
|
||||||
|
url = params.appendTo(url);
|
||||||
|
Assert.assertEquals(url, expectedUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAppendParametersToUrlWithQuerystring()
|
||||||
|
{
|
||||||
|
String url = "http://www.example.com?already=present";
|
||||||
|
String expectedUrl = "http://www.example.com?already=present¶m1=value1¶m2=value%20with%20spaces";
|
||||||
|
|
||||||
|
params.add("param1", "value1");
|
||||||
|
params.add("param2", "value with spaces");
|
||||||
|
|
||||||
|
url = params.appendTo(url);
|
||||||
|
Assert.assertEquals(url, expectedUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldProperlySortParameters()
|
||||||
|
{
|
||||||
|
params.add("param1", "v1");
|
||||||
|
params.add("param6", "v2");
|
||||||
|
params.add("a_param", "v3");
|
||||||
|
params.add("param2", "v4");
|
||||||
|
Assert.assertEquals("a_param=v3¶m1=v1¶m2=v4¶m6=v2", params.sort().asFormUrlEncodedString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldProperlySortParametersWithTheSameName()
|
||||||
|
{
|
||||||
|
params.add("param1", "v1");
|
||||||
|
params.add("param6", "v2");
|
||||||
|
params.add("a_param", "v3");
|
||||||
|
params.add("param1", "v4");
|
||||||
|
Assert.assertEquals("a_param=v3¶m1=v1¶m1=v4¶m6=v2", params.sort().asFormUrlEncodedString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldNotModifyTheOriginalParameterList()
|
||||||
|
{
|
||||||
|
params.add("param1", "v1");
|
||||||
|
params.add("param6", "v2");
|
||||||
|
|
||||||
|
assertNotSame(params, params.sort());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import org.junit.*;
|
|||||||
|
|
||||||
public class RequestTest
|
public class RequestTest
|
||||||
{
|
{
|
||||||
|
|
||||||
private Request getRequest;
|
private Request getRequest;
|
||||||
private Request postRequest;
|
private Request postRequest;
|
||||||
private ConnectionStub connection;
|
private ConnectionStub connection;
|
||||||
@@ -16,8 +15,10 @@ public class RequestTest
|
|||||||
{
|
{
|
||||||
connection = new ConnectionStub();
|
connection = new ConnectionStub();
|
||||||
postRequest = new Request(Verb.POST, "http://example.com");
|
postRequest = new Request(Verb.POST, "http://example.com");
|
||||||
|
postRequest.addBodyParameter("param", "value");
|
||||||
|
postRequest.addBodyParameter("param with spaces", "value with spaces");
|
||||||
postRequest.setConnection(connection);
|
postRequest.setConnection(connection);
|
||||||
getRequest = new Request(Verb.GET, "http://example.com?qsparam=value&other=value+with+spaces");
|
getRequest = new Request(Verb.GET, "http://example.com?qsparam=value&other+param=value+with+spaces");
|
||||||
getRequest.setConnection(connection);
|
getRequest.setConnection(connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ public class RequestTest
|
|||||||
{
|
{
|
||||||
assertEquals(2, getRequest.getQueryStringParams().size());
|
assertEquals(2, getRequest.getQueryStringParams().size());
|
||||||
assertEquals(0, postRequest.getQueryStringParams().size());
|
assertEquals(0, postRequest.getQueryStringParams().size());
|
||||||
assertTrue(getRequest.getQueryStringParams().containsKey("qsparam"));
|
assertTrue(getRequest.getQueryStringParams().contains(new Parameter("qsparam", "value")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -47,12 +48,10 @@ public class RequestTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSetBodyParamsAndHeaders()
|
public void shouldSetBodyParamsAndAddContentLength()
|
||||||
{
|
{
|
||||||
postRequest.addBodyParameter("param", "value");
|
assertEquals("param=value¶m%20with%20spaces=value%20with%20spaces", postRequest.getBodyContents());
|
||||||
postRequest.addBodyParameter("param two", "value with spaces");
|
|
||||||
postRequest.send();
|
postRequest.send();
|
||||||
assertEquals("param%20two=value%20with%20spaces¶m=value", postRequest.getBodyContents());
|
|
||||||
assertTrue(connection.getHeaders().containsKey("Content-Length"));
|
assertTrue(connection.getHeaders().containsKey("Content-Length"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,4 +64,65 @@ public class RequestTest
|
|||||||
assertTrue(connection.getHeaders().containsKey("Content-Length"));
|
assertTrue(connection.getHeaders().containsKey("Content-Length"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAllowAddingQuerystringParametersAfterCreation()
|
||||||
|
{
|
||||||
|
Request request = new Request(Verb.GET, "http://example.com?one=val");
|
||||||
|
request.addQuerystringParameter("two", "other val");
|
||||||
|
request.addQuerystringParameter("more", "params");
|
||||||
|
assertEquals(3, request.getQueryStringParams().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldReturnTheCompleteUrl()
|
||||||
|
{
|
||||||
|
Request request = new Request(Verb.GET, "http://example.com?one=val");
|
||||||
|
request.addQuerystringParameter("two", "other val");
|
||||||
|
request.addQuerystringParameter("more", "params");
|
||||||
|
assertEquals("http://example.com?one=val&two=other%20val&more=params", request.getCompleteUrl());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldHandleQueryStringSpaceEncodingProperly()
|
||||||
|
{
|
||||||
|
assertTrue(getRequest.getQueryStringParams().contains(new Parameter("other param","value with spaces")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAutomaticallyAddContentTypeForPostRequestsWithBytePayload()
|
||||||
|
{
|
||||||
|
postRequest.addPayload("PAYLOAD".getBytes());
|
||||||
|
postRequest.send();
|
||||||
|
assertEquals(Request.DEFAULT_CONTENT_TYPE, connection.getHeaders().get("Content-Type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAutomaticallyAddContentTypeForPostRequestsWithStringPayload()
|
||||||
|
{
|
||||||
|
postRequest.addPayload("PAYLOAD");
|
||||||
|
postRequest.send();
|
||||||
|
assertEquals(Request.DEFAULT_CONTENT_TYPE, connection.getHeaders().get("Content-Type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldAutomaticallyAddContentTypeForPostRequestsWithBodyParameters()
|
||||||
|
{
|
||||||
|
postRequest.send();
|
||||||
|
assertEquals(Request.DEFAULT_CONTENT_TYPE, connection.getHeaders().get("Content-Type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldBeAbleToOverrideItsContentType()
|
||||||
|
{
|
||||||
|
postRequest.addHeader("Content-Type", "my-content-type");
|
||||||
|
postRequest.send();
|
||||||
|
assertEquals("my-content-type", connection.getHeaders().get("Content-Type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldNotAddContentTypeForGetRequests()
|
||||||
|
{
|
||||||
|
getRequest.send();
|
||||||
|
assertFalse(connection.getHeaders().containsKey("Content-Type"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ package org.scribe.services;
|
|||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.scribe.exceptions.OAuthException;
|
import org.scribe.exceptions.*;
|
||||||
|
|
||||||
public class HMACSha1SignatureServiceTest
|
public class HMACSha1SignatureServiceTest
|
||||||
{
|
{
|
||||||
@@ -29,7 +29,7 @@ public class HMACSha1SignatureServiceTest
|
|||||||
String apiSecret = "api secret";
|
String apiSecret = "api secret";
|
||||||
String tokenSecret = "token secret";
|
String tokenSecret = "token secret";
|
||||||
String baseString = "base string";
|
String baseString = "base string";
|
||||||
String signature = "cyxvUDZY/5cQBcBiKulaNgnhN/w=";
|
String signature = "uGymw2KHOTWI699YEaoi5xyLT50=";
|
||||||
assertEquals(signature, service.getSignature(baseString, apiSecret, tokenSecret));
|
assertEquals(signature, service.getSignature(baseString, apiSecret, tokenSecret));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,53 +1,35 @@
|
|||||||
package org.scribe.utils;
|
package org.scribe.utils;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
public class MapUtilsTest
|
public class MapUtilsTest
|
||||||
{
|
{
|
||||||
|
|
||||||
private Map<String, String> unsorted;
|
@Test
|
||||||
|
public void shouldPrettyPrintMap()
|
||||||
@Before
|
|
||||||
public void setup()
|
|
||||||
{
|
{
|
||||||
unsorted = new LinkedHashMap<String, String>();
|
Map<Integer, String> map = new HashMap<Integer, String>();
|
||||||
unsorted.put("d", "fourth");
|
map.put(1, "one");
|
||||||
unsorted.put("a", "first");
|
map.put(2, "two");
|
||||||
unsorted.put("c", "third");
|
map.put(3, "three");
|
||||||
unsorted.put("b", "second");
|
map.put(4, "four");
|
||||||
|
Assert.assertEquals("{ 1 -> one , 2 -> two , 3 -> three , 4 -> four }", MapUtils.toString(map));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSortMap()
|
public void shouldHandleEmptyMap()
|
||||||
{
|
{
|
||||||
Map<String, String> sorted = MapUtils.sort(unsorted);
|
Map<Integer, String> map = new HashMap<Integer, String>();
|
||||||
List<String> values = new ArrayList<String>(sorted.values());
|
Assert.assertEquals("{}", MapUtils.toString(map));
|
||||||
assertEquals("first", values.get(0));
|
|
||||||
assertEquals("second", values.get(1));
|
|
||||||
assertEquals("third", values.get(2));
|
|
||||||
assertEquals("fourth", values.get(3));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldNotModifyTheOriginalMap()
|
public void shouldHandleNullInputs()
|
||||||
{
|
{
|
||||||
Map<String, String> sorted = MapUtils.sort(unsorted);
|
Assert.assertEquals("", MapUtils.toString(null));
|
||||||
assertNotSame(sorted, unsorted);
|
|
||||||
|
|
||||||
List<String> values = new ArrayList<String>(unsorted.values());
|
|
||||||
assertEquals("fourth", values.get(0));
|
|
||||||
assertEquals("first", values.get(1));
|
|
||||||
assertEquals("third", values.get(2));
|
|
||||||
assertEquals("second", values.get(3));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void shouldThrowExceptionForNullMap()
|
|
||||||
{
|
|
||||||
MapUtils.sort(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package org.scribe.utils;
|
||||||
|
|
||||||
|
import org.junit.*;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: Pablo Fernandez
|
||||||
|
*/
|
||||||
|
public class OAuthEncoderTest
|
||||||
|
{
|
||||||
|
@Test
|
||||||
|
public void shouldPercentEncodeString()
|
||||||
|
{
|
||||||
|
String plain = "this is a test &^";
|
||||||
|
String encoded = "this%20is%20a%20test%20%26%5E";
|
||||||
|
assertEquals(encoded, OAuthEncoder.encode(plain));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldFormURLDecodeString()
|
||||||
|
{
|
||||||
|
String encoded = "this+is+a+test+%26%5E";
|
||||||
|
String plain = "this is a test &^";
|
||||||
|
assertEquals(plain, OAuthEncoder.decode(encoded));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldPercentEncodeAllSpecialCharacters()
|
||||||
|
{
|
||||||
|
String plain = "!*'();:@&=+$,/?#[]";
|
||||||
|
String encoded = "%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%23%5B%5D";
|
||||||
|
assertEquals(encoded, OAuthEncoder.encode(plain));
|
||||||
|
assertEquals(plain, OAuthEncoder.decode(encoded));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldNotPercentEncodeReservedCharacters()
|
||||||
|
{
|
||||||
|
String plain = "abcde123456-._~";
|
||||||
|
String encoded = plain;
|
||||||
|
assertEquals(encoded, OAuthEncoder.encode(plain));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfStringToEncodeIsNull()
|
||||||
|
{
|
||||||
|
String toEncode = null;
|
||||||
|
OAuthEncoder.encode(toEncode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldThrowExceptionIfStringToDecodeIsNull()
|
||||||
|
{
|
||||||
|
String toDecode = null;
|
||||||
|
OAuthEncoder.decode(toDecode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldPercentEncodeCorrectlyTwitterCodingExamples()
|
||||||
|
{
|
||||||
|
// These tests are part of the Twitter dev examples here -> https://dev.twitter.com/docs/auth/percent-encoding-parameters
|
||||||
|
String sources[] = {"Ladies + Gentlemen", "An encoded string!", "Dogs, Cats & Mice"};
|
||||||
|
String encoded[] = {"Ladies%20%2B%20Gentlemen", "An%20encoded%20string%21", "Dogs%2C%20Cats%20%26%20Mice"};
|
||||||
|
|
||||||
|
for(int i = 0; i < sources.length; i++)
|
||||||
|
{
|
||||||
|
Assert.assertEquals(encoded[i], OAuthEncoder.encode(sources[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -53,6 +53,17 @@ public class PreconditionsTest
|
|||||||
Preconditions.checkValidUrl("https://www.example.com", ERROR_MSG);
|
Preconditions.checkValidUrl("https://www.example.com", ERROR_MSG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void shouldAllowNonStandarProtocolsForAndroid()
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl("x-url-custom://www.example.com", ERROR_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void shouldNotAllowStrangeProtocolNames()
|
||||||
|
{
|
||||||
|
Preconditions.checkValidUrl("$weird*://www.example.com", ERROR_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
public void shouldAllowOutOfBandAsValidCallbackValue()
|
public void shouldAllowOutOfBandAsValidCallbackValue()
|
||||||
{
|
{
|
||||||
Preconditions.checkValidOAuthCallback("oob", ERROR_MSG);
|
Preconditions.checkValidOAuthCallback("oob", ERROR_MSG);
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
package org.scribe.utils;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import org.junit.*;
|
|
||||||
|
|
||||||
public class URLUtilsTest
|
|
||||||
{
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setup()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldPercentEncodeMap()
|
|
||||||
{
|
|
||||||
Map<String, String> params = new LinkedHashMap<String, String>();
|
|
||||||
params.put("key", "value");
|
|
||||||
params.put("key with spaces", "value with spaces");
|
|
||||||
params.put("&symbols!", "#!");
|
|
||||||
|
|
||||||
String expected = "key=value&key%20with%20spaces=value%20with%20spaces&%26symbols%21=%23%21";
|
|
||||||
assertEquals(expected, URLUtils.formURLEncodeMap(params));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldReturnEmptyStringForEmptyMap()
|
|
||||||
{
|
|
||||||
Map<String, String> params = new LinkedHashMap<String, String>();
|
|
||||||
String expected = "";
|
|
||||||
assertEquals(expected, URLUtils.formURLEncodeMap(params));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldPercentEncodeString()
|
|
||||||
{
|
|
||||||
String toEncode = "this is a test &^";
|
|
||||||
String expected = "this%20is%20a%20test%20%26%5E";
|
|
||||||
assertEquals(expected, URLUtils.percentEncode(toEncode));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldPercentDecodeString()
|
|
||||||
{
|
|
||||||
String toDecode = "this+is+a+test+%26%5E";
|
|
||||||
String expected = "this is a test &^";
|
|
||||||
assertEquals(expected, URLUtils.percentDecode(toDecode));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void shouldThrowExceptionIfMapIsNull()
|
|
||||||
{
|
|
||||||
Map<String, String> nullMap = null;
|
|
||||||
URLUtils.formURLEncodeMap(nullMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void shouldThrowExceptionIfStringToEncodeIsNull()
|
|
||||||
{
|
|
||||||
String toEncode = null;
|
|
||||||
URLUtils.percentEncode(toEncode);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void shouldThrowExceptionIfStringToDecodeIsNull()
|
|
||||||
{
|
|
||||||
String toDecode = null;
|
|
||||||
URLUtils.percentDecode(toDecode);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user