2014-01-03 3 views
2

마켓 플레이스 앱의 기능 중 하나는 IMAP을 통해 사용자의 Gmail 계정에 액세스하는 것입니다. 우리는 다음 IMAP를 만들기 위해 https://code.google.com/p/google-mail-oauth2-tools의 예에 따라 코드를 사용하는Google Apps Marketplace 서비스 계정을 사용하여 Gmail IMAP 및 기타 서비스에 연결하는 올바른 방법

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(SERVICE_ACCOUNT_ID) 
    .setServiceAccountScopes(Arrays.asList(GMAIL_SCOPE)) 
    .setServiceAccountPrivateKey(PRIVATE_KEY) 
    .setServiceAccountUser(emailAddress) 
    .build(); 
credential.refreshToken(); 

을 다음과 같이 우리는 this example in the java-gmail-imap project 유사한 구글-API - 자바 클라이언트와 구글의 OAuth - 자바 클라이언트 라이브러리 및 코드를 사용하는 연결 예

IMAPStore imapStore = OAuth2Authenticator.connectToImap("imap.googlemail.com", 
    993, emailAddress, credential.getAccessToken(), false); 

이 제대로 작동하려면 나타나는 시간의 대부분, 그러나 우리가 refreshToken()에 의해 만들어 구글에 대한 호출이 HTTP 500 오류와 함께 실패 요청의 작지만 의미있는 번호와 HTML 응답을위한 것을보고있다 JSON은 일반적으로 반환됩니다.

<p class="large"><b>500.</b> <ins>That's an error.</ins></p> 
<p class="large">The server could not process your request. 
<ins>That's all we know.</ins></p> 

우리는 우리가 토큰을 새로 고침 구글의 개발자 옹호에 의해 권고 된 서비스 계정에 대한 지원되지 않으며 우리는 this example에서 같은 방법을 사용한다.

그러나 다음 refreshTokenaccessToken에 대한 호출이 자격 증명 개체에 채워지지 않고 것 같아 다음이 우리가 executeRefreshToken()처럼 보이지 않았다 GoogleCredential의 소스에서 OAuth2Authenticator.connectToImap

를 호출 할 때 NullPointerException 결과 새로 고침을 수행하는 대신 새 토큰을 요청하기 만하면 Credential에있는이 비트의 코드는 액세스 토큰을 채우는 것을 처리합니다.

TokenResponse tokenResponse = executeRefreshToken(); 
if (tokenResponse != null) { 
    setFromTokenResponse(tokenResponse); .... 

간헐적으로 발생하는 500 개의 오류를 해결하기 위해 재시도 루프에서 refreshToken() 호를 호출해야하는지 또는이 시나리오에서 권장되는 방법을 따르기 위해 코드를 변경해야하는지 여부는 확실하지 않았습니다.

누구든지 조언 할 수 있습니까?

답변

1

프로덕션 환경에서 java-gmail-imap example 코드를 사용합니다 (하지만 대학 포털에받은 편지함을 표시하는 데만 사용됩니다. 예를 들어 동일한 새로 고침 토큰을 다시 사용해야하는 대화가별로 없습니다).

귀하의 사용 방법에 따라 귀하의 경우 어떤 조절 장치가 작동하고 있는지 궁금합니다. (내가 읽은 장소는 Gmail can occasionally throttle access입니다).

다른 곳에서는 Google API가 exponential backoff algorithm을 사용하여 재시도에 대해 이야기합니다.

OAuth 2.0의 사용을 다른 Google 서비스 API 및 Gmail과 비교할 때는 약간주의해야합니다. Gmail은 XOAUTH2를 사용한다는 점에서 특별합니다. 그것은 refreshToken call을 필요로하는 다른 Google API를 본 것으로 보입니다. 설명서가 약간 명확하지 않고 "Refresh the access token, if necessary"과 같은 것을 말합니다 (이 단계 없이는 작동하지 않는 것 같지만 credential.setRefreshToken (String refreshToken)을 통해 새로 고침 토큰을 다시 사용하여 실험을하지 않았습니다). .

나는 어떻게 당신이 타고 있는지 듣고 싶습니다.

+0

감사합니다. 현재 우리는 자체 재시도 루프를 사용하고 있습니다. 즉'getAccessToken()'이'refreshToken()'을 호출 한 후 null을 반환하면 재 시도 사이의 지연이 증가하면서 여러 번 재 시도합니다. Google 로그에서 첫 번째 또는 두 번째 재시도 후에 실패한 요청의 상당 부분이 처음에는 성공한 것으로 나타 났으므로이 작업이 조금 도움이되었습니다. IMAP 액세스는 현재 Google에서이 방식으로 액세스 토큰이 필요한 유일한 Google 서비스입니다. 일부 사용자에 대해서도 Gmail 스로틀 메시지가 표시되지만 인증 후에 표시됩니다. 더 많은 것을 발견하면 분명히 알려 드리겠습니다. – mikej