Empty secret returned in Google Gmail OAuth
I am trying to read Gmail in-box using IMAP with OAuth. When using basic main method, everything works fine:
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");
}
but, when I move towards 3 leg OAuth, I am getting back empty access token secret, this is controller code:
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: " + acces开发者_如何学PythonsTokenSecret);
//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";
}
What I am doing wrong? I bet this is something simple - but I am just trying for too long :)
Solved... in case someone needs it:
@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";
}
精彩评论