package glaze.oauth;
import com.google.common.base.Preconditions;
import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthConsumer;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.exception.OAuthException;
public abstract class OAuthFlow
{
public enum FlowState {
INIT, AUTH_REQUESTED, VERIFIED
}
private final OAuthConsumer consumer;
private final OAuthProvider provider;
private FlowState state;
public OAuthFlow(OAuthConsumer consumer, OAuthProvider provider)
{
this.consumer = consumer;
this.provider = provider;
this.state = FlowState.INIT;
}
public OAuthFlow(String key, String secret)
{
this.consumer = new DefaultOAuthConsumer(key, secret);
this.provider = new DefaultOAuthProvider(requestTokenUrl(), accessTokenUrl(), authorizeWebsiteUrl());
this.state = FlowState.INIT;
}
public OAuthConsumer confirmAuthorization(String pin) throws OAuthException
{
Preconditions.checkState(FlowState.AUTH_REQUESTED.equals(state));
provider.retrieveAccessToken(consumer, pin);
this.state = FlowState.VERIFIED;
return consumer;
}
public OAuthConsumer getConsumer()
{
return consumer;
}
public FlowState getState()
{
return state;
}
public String name()
{
return "Unnamed";
}
public String requestAuthorization() throws OAuthException
{
return requestAuthorization(OAuth.OUT_OF_BAND);
}
public String requestAuthorization(String callback) throws OAuthException
{
this.state = FlowState.AUTH_REQUESTED;
return provider.retrieveRequestToken(consumer, callback);
}
abstract protected String accessTokenUrl();
abstract protected String authorizeWebsiteUrl();
abstract protected String requestTokenUrl();
}