Skip to content

Instantly share code, notes, and snippets.

@dmitrygusev
Created August 11, 2014 07:19
Show Gist options
  • Save dmitrygusev/388040ea136338bc8cea to your computer and use it in GitHub Desktop.
Save dmitrygusev/388040ea136338bc8cea to your computer and use it in GitHub Desktop.

Revisions

  1. dmitrygusev created this gist Aug 11, 2014.
    87 changes: 87 additions & 0 deletions XeroOAuthService.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,87 @@
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;

    import javax.net.ssl.HttpsURLConnection;

    import org.scribe.builder.api.DefaultApi10a;
    import org.scribe.model.OAuthConfig;
    import org.scribe.model.OAuthConstants;
    import org.scribe.model.OAuthRequest;
    import org.scribe.model.Token;
    import org.scribe.model.Verb;
    import org.scribe.model.Verifier;
    import org.scribe.oauth.OAuth10aServiceImpl;
    import org.scribe.services.DefaultConnectionFactory;
    import org.scribe.services.RequestFactory;

    public class XeroOAuthService extends OAuth10aServiceImpl implements TokenRefresher
    {
    public static class Context
    {
    public XeroToken oldToken;
    public boolean forRefresh;
    }

    private final XeroOAuthService.Context context;

    public XeroOAuthService(final DefaultApi10a api, OAuthConfig config, final XeroOAuthService.Context context)
    {
    super(api, config, new RequestFactory()
    {
    @Override
    public OAuthRequest createRequest(Verb verb, String url)
    {
    OAuthRequest request = new OAuthRequest(verb, url, new DefaultConnectionFactory()
    {
    @Override
    public HttpURLConnection createConnection(String url) throws MalformedURLException, IOException
    {
    HttpsURLConnection connection = (HttpsURLConnection) super.createConnection(url);
    XeroPartnerApi partnerApi = (XeroPartnerApi) api;
    connection.setSSLSocketFactory(partnerApi.getSslContext().getSocketFactory());
    return connection;
    }
    });

    if (context.forRefresh)
    {
    request.addOAuthParameter(
    OAuthConstants.SESSION_HANDLE,
    context.oldToken.getOauthSessionHandle());
    }

    return request;
    }
    });

    this.context = context;
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T extends Jsonable> T refreshToken(T token)
    {
    XeroToken xeroToken = (XeroToken) token;

    try
    {
    context.forRefresh = true;
    context.oldToken = xeroToken;

    // We renew token by getting new access token and passing oauth_session_handle
    // http://oauth.googlecode.com/svn/spec/ext/session/1.0/drafts/1/spec.html#rfc.section.5.3

    Token newToken = getAccessToken(
    new Token(xeroToken.getOauthToken(), xeroToken.getOauthTokenSecret()),
    new Verifier("ignored"));

    return (T) XeroToken.fromRawResponse(newToken.getRawResponse());
    }
    finally
    {
    context.forRefresh = false;
    context.oldToken = null;
    }
    }
    }