Пустой секрет, возвращенный в OAuth Google Gmail

#oauth #imap

#oauth #imap

Вопрос:

Я пытаюсь прочитать входящие в Gmail, используя IMAP с OAuth. При использовании базового метода main все работает нормально:

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

Что я делаю не так? Бьюсь об заклад, это что-то простое, но я просто пытаюсь слишком долго 🙂

Ответ №1:

Решаемая … на случай, если кому-то это понадобится:

 @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";
}
  

Комментарии:

1. Я хотел бы реализовать это решение, не могли бы вы, пожалуйста, сообщить, где вы нашли jar для этого. Два года спустя — это все еще лучшее решение?