|
Play Framework/Scala example source code file (OAuth.java)
The OAuth.java Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.libs.oauth;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import oauth.signpost.AbstractOAuthConsumer;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.exception.OAuthException;
import oauth.signpost.http.HttpRequest;
import play.libs.ws.*;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
public class OAuth {
private ServiceInfo info;
private OAuthProvider provider;
public OAuth(ServiceInfo info) {
this(info, true);
}
public OAuth(ServiceInfo info, boolean use10a) {
this.info = info;
this.provider = new CommonsHttpOAuthProvider(info.requestTokenURL, info.accessTokenURL, info.authorizationURL);
this.provider.setOAuth10a(use10a);
}
public ServiceInfo getInfo() {
return info;
}
public OAuthProvider getProvider() {
return provider;
}
/**
* Request the request token and secret.
*
* @param callbackURL the URL where the provider should redirect to (usually a URL on the current app)
* @return A Right(RequestToken) in case of success, Left(OAuthException) otherwise
*/
public RequestToken retrieveRequestToken(String callbackURL) {
OAuthConsumer consumer = new DefaultOAuthConsumer(info.key.key, info.key.secret);
try {
provider.retrieveRequestToken(consumer, callbackURL);
return new RequestToken(consumer.getToken(), consumer.getTokenSecret());
} catch(OAuthException ex) {
throw new RuntimeException(ex);
}
}
/**
* Exchange a request token for an access token.
*
* @param token the token/secret pair obtained from a previous call
* @param verifier a string you got through your user, with redirection
* @return A Right(RequestToken) in case of success, Left(OAuthException) otherwise
*/
public RequestToken retrieveAccessToken(RequestToken token, String verifier) {
OAuthConsumer consumer = new DefaultOAuthConsumer(info.key.key, info.key.secret);
consumer.setTokenWithSecret(token.token, token.secret);
try {
provider.retrieveAccessToken(consumer, verifier);
return new RequestToken(consumer.getToken(), consumer.getTokenSecret());
} catch (OAuthException ex) {
throw new RuntimeException(ex);
}
}
/**
* The URL where the user needs to be redirected to grant authorization to your application.
*
* @param token request token
*/
public String redirectUrl(String token) {
return oauth.signpost.OAuth.addQueryParameters(
provider.getAuthorizationWebsiteUrl(),
oauth.signpost.OAuth.OAUTH_TOKEN,
token
);
}
/**
* A consumer key / consumer secret pair that the OAuth provider gave you, to identify your application.
*/
public static class ConsumerKey {
public String key;
public String secret;
public ConsumerKey(String key, String secret) {
this.key = key;
this.secret = secret;
}
}
/**
* A request token / token secret pair, to be used for a specific user.
*/
public static class RequestToken {
public String token;
public String secret;
public RequestToken(String token, String secret) {
this.token = token;
this.secret = secret;
}
}
/**
* The information identifying a oauth provider: URLs and the consumer key / consumer secret pair.
*/
public static class ServiceInfo {
public String requestTokenURL;
public String accessTokenURL;
public String authorizationURL;
public ConsumerKey key;
public ServiceInfo(String requestTokenURL, String accessTokenURL, String authorizationURL, ConsumerKey key) {
this.requestTokenURL = requestTokenURL;
this.accessTokenURL = accessTokenURL;
this.authorizationURL = authorizationURL;
this.key = key;
}
}
/**
* A signature calculator for the Play WS API.
*
* Example:
* {{{
* WS.url("http://example.com/protected").sign(OAuthCalculator(service, tokens)).get()
* }}}
*/
public static class OAuthCalculator extends AbstractOAuthConsumer implements WSSignatureCalculator {
public OAuthCalculator(ConsumerKey consumerKey, RequestToken token) {
super(consumerKey.key, consumerKey.secret);
this.setTokenWithSecret(token.token, token.secret);
}
@Override
protected HttpRequest wrap(Object request) {
if (request instanceof WSRequest) {
return new WSRequestAdapter((WSRequest)request);
} else {
throw new IllegalArgumentException("OAuthCalculator expects requests of type play.libs.ws.WSRequest");
}
}
@Override
public void sign(WSRequest request) {
try {
sign(wrap(request));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static class WSRequestAdapter implements HttpRequest {
private WSRequest request;
public WSRequestAdapter(WSRequest request) {
this.request = request;
}
@Override
public Object unwrap() {
return request;
}
@Override
public Map<String, String> getAllHeaders() {
return Maps.transformValues(request.getAllHeaders(), new Function<List<String>, String>(){
@Override public String apply(List<String> values) {
if (values.size() == 0) return "";
return values.get(values.size() - 1);
}});
}
@Override
public String getHeader(String name) {
List<String> values = request.getHeader(name);
if (values.size() == 0) return "";
return values.get(values.size() - 1);
}
@Override
public String getContentType() {
return getHeader("Content-Type");
}
@Override
public InputStream getMessagePayload() {
byte[] body = request.getBody();
if (body == null) {
body = new byte[0];
}
return new ByteArrayInputStream(body);
}
@Override
public String getMethod() {
return request.getMethod();
}
@Override
public void setHeader(String name, String value) {
request.setHeader(name, value);
}
@Override
public String getRequestUrl() {
return request.getUrl();
}
@Override
public void setRequestUrl(String url) {
request.setUrl(url);
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework OAuth.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.