javaoauthevernotescribe

Exception while retrieving OAuth access token using scribe


I am trying to generate OAuth access token for my app to fetch notes from Evernote. Below is the Java code for it

public class EverNoteOauthGenerator {
    public static void main(String[] args) throws EDAMUserException, EDAMSystemException, TException {
        Class<? extends EvernoteApi> providerClass = EvernoteApi.Sandbox.class;
        /**
        if (EVERNOTE_SERVICE == EvernoteService.PRODUCTION) {
          providerClass = org.scribe.builder.api.EvernoteApi.class;
        } **/

        // Generate Request token & Request secret
        String CONSUMER_KEY = "******";
        String CONSUMER_SECRET = "******";
        String cbUrl = "https://sandbox.evernote.com/OAuth.action?oauth_token=****.158D9C1C696.6C6F63616C686F7374.089C889A2F3D722B9ECC231961A3BF49";
        OAuthService service = new ServiceBuilder()
          .provider(providerClass)
          .apiKey(CONSUMER_KEY)
          .apiSecret(CONSUMER_SECRET)
          .callback(cbUrl)
          .build();

        Token scribeRequestToken = service.getRequestToken();
        //String requestToken = scribeRequestToken.getToken();
        //String requestTokenSecret = scribeRequestToken.getSecret();

        String authUrl = EvernoteService.SANDBOX.getAuthorizationUrl(scribeRequestToken.getToken());

        // Generate OAuth Access token
        Token scribeRequestToken = new Token(requestToken, requestTokenSecret);

        Verifier scribeVerifier = new Verifier("6E5879A40CBEB7CCF77507BE8FE905AA");
        Token scribeAccessToken = service.getAccessToken(scribeRequestToken, scribeVerifier);
        EvernoteAuth evernoteAuth = EvernoteAuth.parseOAuthResponse(EvernoteService.SANDBOX, scribeAccessToken.getRawResponse());
        String accessToken = evernoteAuth.getToken();
        String noteStoreUrl = evernoteAuth.getNoteStoreUrl();
        System.out.println("Access token :: " + accessToken);

        evernoteAuth = new EvernoteAuth(EvernoteService.SANDBOX, accessToken);
        NoteStoreClient noteStoreClient = new ClientFactory(evernoteAuth).createNoteStoreClient();

        List<Notebook> notebooks = noteStoreClient.listNotebooks();
        for (Notebook notebook : notebooks) {
          System.out.println("Notebook: " + notebook.getName());
        }
    }
}

This code is written with the following github code as reference https://github.com/evernote/evernote-sdk-java/blob/master/sample/oauth/src/main/webapp/index.jsp

Below is the exception which I get while retrieving the access token

Exception in thread "main" org.scribe.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this

at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:41)
    at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:27)
    at org.scribe.oauth.OAuth10aServiceImpl.getAccessToken(OAuth10aServiceImpl.java:82)
    at com.evernote.auth.EverNoteOauthGenerator.main(EverNoteOauthGenerator.java:51)

Solution

  • The callback URL has to be your URL where a user is redirected to after your app is authorized. When the user is redirected back, you should be able to obtain an OAuth verifier from the URL parameters while it seems that the verifier is hard-coded in your code. See also this doc about authentication.