2011-05-23 40 views
1

我正嘗試使用IMAP和OAuth讀取Gmail收件箱。 當使用基本的主要方法,一切工作正常:Google Gmail返回的空密碼OAuth

private static final String SCOPE = "https://mail.google.com/"; 

private static final String CONSUMER_KEY = "www.******.com"; 
private static final String CONSUMER_SECRET = "******"; 
private static final String USER_EMAIL = "******"; 

public static void main(String[] args) throws Exception { 

    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 

    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 
    OAuthSigner signer = new OAuthHmacSha1Signer(); 

    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

    oauthParameters.setScope(SCOPE); 

    oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

    String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 
    System.out.println(requestUrl); 
    System.out.println("Please visit the URL above to authorize your OAuth " 
      + "request token. Once that is complete, press any key to " 
      + "continue..."); 
    System.in.read(); 

    String token = oauthHelper.getAccessToken(oauthParameters); 
    System.out.println("OAuth Access Token: " + token); 
    System.out.println(); 

    //IMAP 
    XoauthAuthenticator.initialize(); 

    IMAPSSLStore imapSslStore = XoauthAuthenticator.connectToImap("imap.googlemail.com", 
      993, 
      USER_EMAIL, 
      oauthParameters.getOAuthToken(), 
      oauthParameters.getOAuthTokenSecret(), 
      new OAuthConsumer(null, CONSUMER_KEY, CONSUMER_SECRET, null), 
      true); 
    System.out.println("Successfully authenticated to IMAP.\n"); 
} 

,但是,當我向3腿OAuth的移動,我又回到空的訪問令牌的祕密,這是控制器代碼:

private static final String CALLBACK = "http://www.*******.com/oauthback.htm"; 

private static final String SCOPE = "https://mail.google.com/"; 
private static final String CONSUMER_KEY = "www.******.com"; 
private static final String CONSUMER_SECRET = "******"; 
private static final String USER_EMAIL = "******"; 

@RequestMapping("/oauth.htm") 
public void oauth(HttpServletResponse response, HttpSession session) throws OAuthException, IOException, 
     Base64DecoderException, InvalidKeySpecException, NoSuchAlgorithmException { 
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthCallback(CALLBACK); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 
    oauthParameters.setScope(SCOPE); 

    OAuthSigner signer = new OAuthHmacSha1Signer(); 
    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

    oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

    String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 
    System.out.println(requestUrl); 

    String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); 
    System.out.println("OAuth Access Token's Secret: " + accessTokenSecret); 
    session.setAttribute("accessTokenSecret", accessTokenSecret); 

    response.sendRedirect(requestUrl); 
} 

@RequestMapping("/oauthback.htm") 
public String oauthback(HttpServletRequest request, HttpSession session, Model model) throws Exception { 
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 

    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); 
    oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters); 

    String accessToken = oauthParameters.getOAuthToken(); 
    System.out.println("OAuth Access Token: " + accessToken); 

    String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); 
    System.out.println("OAuth Access Token's Secret: " + accessTokenSecret); 

    //IMAP 
    XoauthAuthenticator.initialize(); 

    IMAPSSLStore imapSslStore = XoauthAuthenticator.connectToImap("imap.googlemail.com", 
      993, 
      USER_EMAIL, 
      accessToken, 
      accessTokenSecret, 
      new OAuthConsumer(CALLBACK, CONSUMER_KEY, CONSUMER_SECRET, null), 
      true); 
    System.out.println("Successfully authenticated to IMAP.\n"); 
    model.addAttribute("msg", "accessToken: " + accessToken + " accessTokenSecret: " + accessTokenSecret); 

    return "errorView"; 
} 

什麼我做錯了?我敢肯定,這是簡單的東西 - 但我只是想太久:)

回答

2

解決......萬一有人需要它:

@RequestMapping("/oauth.htm") 
public void oauth(HttpServletResponse response, HttpSession session) throws OAuthException, IOException, 
     Base64DecoderException, InvalidKeySpecException, NoSuchAlgorithmException { 
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthCallback(CALLBACK); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 
    oauthParameters.setScope(SCOPE); 

    oauthParameters.setOAuthType(OAuthParameters.OAuthType.THREE_LEGGED_OAUTH); 


    OAuthSigner signer = new OAuthHmacSha1Signer(); 
    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

    oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

    String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 
    System.out.println(requestUrl); 

    String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); 
    System.out.println("OAuth Access Token's Secret: " + accessTokenSecret); 
    session.setAttribute("accessTokenSecret", accessTokenSecret); 

    response.sendRedirect(requestUrl); 
} 

@RequestMapping("/oauthback.htm") 
public String oauthback(HttpServletRequest request, HttpSession session, Model model) throws Exception { 
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); 
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); 

    System.out.println("Query String: " + request.getQueryString()); 

    GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); 
    oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters); 

    oauthParameters.setOAuthTokenSecret((String) session.getAttribute("accessTokenSecret")); 

    String token = oauthHelper.getAccessToken(oauthParameters); 
    System.out.println("OAuth Token: " + token); 

    String accessToken = oauthParameters.getOAuthToken(); 
    System.out.println("OAuth Access Token: " + accessToken); 

    String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); 
    System.out.println("OAuth Access Token's Secret: " + accessTokenSecret); 

    //IMAP 
    XoauthAuthenticator.initialize(); 

    IMAPSSLStore imapSslStore = XoauthAuthenticator.connectToImap("imap.googlemail.com", 
      993, 
      USER_EMAIL, 
      accessToken, 
      accessTokenSecret, 
      new OAuthConsumer(CALLBACK, CONSUMER_KEY, CONSUMER_SECRET, null), 
      true); 
    System.out.println("Successfully authenticated to IMAP.\n"); 
    model.addAttribute("msg", "accessToken: " + accessToken + " accessTokenSecret: " + accessTokenSecret); 

    return "errorView"; 
} 
+0

我想實現這個解決方案可以請告知哪裏你找到了這個罐子。兩年後 - 這仍然是最好的解決方案嗎? – Dan 2013-06-11 16:41:17