Использование Oauth и Gdata для создания простого приложения на Java

Я пытаюсь создать простое приложение на движке приложения, в котором пользователи входят в систему через свою учетную запись Google, а затем добавляют событие в свой календарь. И я использую Java вместе с Eclipse для этого. Я нашел простой код в Интернете:

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 
    } 
} 

Я зарегистрировал свое приложение и добавил KEY и Secret над функцией, но когда я развертываю его в механизме приложения, он выдает ошибку сервера 500.

Может ли кто-нибудь опубликовать простую программу Java, которая использует gdata и oauth для входа в систему пользователя Google и печати контактов на экране? Спасибо. -Маной


person Manoj Reddy    schedule 10.06.2011    source источник


Ответы (1)


Я столкнулся с той же проблемой, и мне потребовалось некоторое время, чтобы понять это.

На самом деле проблема в том, что вам не хватает некоторых частей в процессе авторизации OAuth.

Как вы, возможно, знаете, это трехэтапный процесс:

  1. Получить токен несанкционированного запроса
  2. Авторизовать токен запроса
  3. Обменяйте авторизованный токен запроса на токен доступа и с его помощью совершайте вызовы к данным Google.

В вашем случае вы делаете шаг 3 напрямую.

Поэтому, прежде чем вы сможете вызвать сервлет, описанный выше, и эффективно получить данные Google пользователя, пользователь должен предоставить доступ к вашему приложению, перейдя по URL-адресу авторизации из своего веб-браузер.

Вам нужен первый сервлет, доступный, например, по адресу 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);
        }
        }

Как только пользователь перейдет по этому URL-адресу и предоставит доступ, теперь вы можете вызвать свой второй сервлет, и он должен работать.

Дополнительную информацию можно найти на странице Google OAuth здесь

Надеюсь, поможет!

person tinesoft    schedule 20.08.2011