【问题标题】:Using Oauth and Gdata to build a simple application in Java使用 Oauth 和 Gdata 在 Java 中构建一个简单的应用程序
【发布时间】:2011-09-12 09:07:19
【问题描述】:

我正在尝试在用户登录的应用引擎上创建一个简单的应用 通过他们的谷歌帐户,然后它添加一个事件到他们 日历。 为此,我正在使用 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 服务器错误。

有人可以发布一个使用 gdata 和 oauth 的简单 java 程序 登录 Google 用户并在屏幕上打印联系人? 谢谢。 -Manoj

【问题讨论】:

    标签: java google-app-engine oauth gdata


    【解决方案1】:

    我遇到了同样的问题,我花了一段时间才弄明白。

    实际上,问题在于您在 OAuth 授权过程中缺少某些部分。

    如您所知,这是一个三足流程:

    1. 获取未经授权的请求令牌
    2. 授权请求令牌
    3. 将授权的请求令牌交换为访问令牌,并使用它调用 Google 数据。

    在您的情况下,您直接执行第 3 步。

    因此,在您调用上述 servlet 并有效检索用户的 Google 数据之前, 用户必须有权访问您的应用程序,方法是从其网络浏览器浏览到授权 URL

    您需要第一个 servlet,例如可通过 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 并授予访问权限后,您现在可以调用第二个 servlet,它应该可以工作了。

    更多信息可以在谷歌 OAuth 页面here找到

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多