Manoj Reddy
Manoj Reddy

Reputation: 146

Using Oauth and Gdata to build a simple application in Java

I am trying to create a simple app on the app engine where users log in through their Google account, and then it adds an event to their calendar. And I am using Java along with Eclipse for this. I have found a simple code online:

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
    // Create an instance of GoogleOAuthParameters 
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 
    oauthParameters.setScope("http://docs.google.com/feeds/"); 
    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper( 
            new OAuthHmacSha1Signer()); 
    // Remember the token secret that we stashed? Let's get it back 
    // now. We need to add it to oauthParameters 
    String oauthTokenSecret = (String) req.getSession().getAttribute( 
    "oauthTokenSecret"); 
    oauthParameters.setOAuthTokenSecret(oauthTokenSecret); 
    // The query string should contain the oauth token, so we can just 
    // pass the query string to our helper object to correctly 
    // parse and add the parameters to our instance of oauthParameters 
    oauthHelper.getOAuthParametersFromCallback(req.getQueryString(), 
            oauthParameters); 
    try { 
        // Now that we have all the OAuth parameters we need, we can 
        // generate an access token and access token secret. These 
        // are the values we want to keep around, as they are 
        // valid for all API calls in the future until a user revokes 
        // our access. 
        String accessToken = oauthHelper.getAccessToken(oauthParameters); 
        String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); 
        // In a real application, we want to redirect the user to a new 
        // servlet that makes API calls. For the safe of clarity and simplicity, 
        // we'll just reuse this servlet for making API calls. 
        oauthParameters = new GoogleOAuthParameters(); 
        oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
        oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 
        // This is interesting: we set the OAuth token and the token secret 
        // to the values extracted by oauthHelper earlier. These values are 
        // already in scope in this example code, but they can be populated 
        // from reading from the datastore or some other persistence mechanism. 
        oauthParameters.setOAuthToken(accessToken); 
        oauthParameters.setOAuthTokenSecret(accessTokenSecret); 
        oauthParameters.setOAuthCallback("http://www.facebook.com"); 
        oauthHelper.getUnauthorizedRequestToken(oauthParameters); 
        // Create an instance of the DocsService to make API calls 
        DocsService client = new DocsService("Malware Inc."); 
        // Use our newly built oauthParameters 
        client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); 
        URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full"); 
        DocumentListFeed resultFeed = client.getFeed(feedUrl, 
                DocumentListFeed.class); 
        for (DocumentListEntry entry : resultFeed.getEntries()) { 
            resp.getWriter().println(entry.getTitle().getPlainText()); 
        } 
    } catch (OAuthException e) { 
        // Something went wrong. Usually, you'll end up here if we have invalid 
        // oauth tokens 
        resp.getWriter().println("Here is the problem"); 
        //Server shows 500 problem 
    } catch (ServiceException e) { 
        // Handle this exception 
    } 
} 

I have registered my application and added the KEY and Secret above the function, but when I deploy it to the app engine it gives a 500 server error.

Could someone post a simple java program that uses gdata and oauth to log in a Google user and print the contacts on the screen? Thanks. -Manoj

Upvotes: 3

Views: 2340

Answers (1)

tinesoft
tinesoft

Reputation: 766

I was facing the same problem, and it took me a while to figure it out.

Actually, the problem is that your are missing some parts in the OAuth authorization process.

As you may know, it a 3-legged process:

  1. Get an unauthorized request token
  2. Authorize the request token
  3. Exchange the authorized request token for an access token and make calls to Google Data with it.

In your case, you are doing step 3 directly.

So before you can call the servlet you described above, and effectively retrieve user's Google Data, the user must have grant access to your application, by browsing to an authorization URL from his web browser.

You need a first servlet , for example accessible at http://yourapp.com/RequestAccess

        public void doGet(HttpServletRequest req, HttpServletResponse resp) {            

        GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();

        oauthParameters.setOAuthConsumerKey(YOUR_CONSUMER_KEY);
        oauthParameters.setOAuthConsumerSecret(YOUR_CONSUMER_SECRET);
        OAuthHmacSha1Signer signer = new OAuthHmacSha1Signer();

        GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer);
        oauthParameters.setScope(FEED_SCOPE);

        try {
            oauthHelper.getUnauthorizedRequestToken(oauthParameters);

            //GET THE UNAUTHORIZED TOKENS
            String oauthRequestToken = oauthParameters.getOAuthToken();
            String oauthTokenSecret = oauthParameters.getOAuthTokenSecret();

            //SAVE THEM SOMEWEHERE (FOR EXAMPLE IN THE SESSION LIKE YOU DID)

            //  ....

            //GET THE AUHTORIZATION URL
            String authorizationURL= oauthHelper.createUserAuthorizationUrl(oauthParameters);

            // YOU NOW HAVE THE AUHTORIZATION URL,  SEND IT BACK TO THE USER SOMEHOW
            // ( FOR EXAMPLE BY REDIRECTING THE REQUEST TO THAT URL)

            // ...
        } catch (OAuthException e1) {
            LOGGER.error("error while getting unauthorized request token '{}' ", e1);
        }
        }

Once the user has navigate to that URL, and grant acces, you can now call your second servlet and it should work.

More info can be found on Google OAuth page here

Hope it helps!

Upvotes: 1

Related Questions