2015-01-21 2 views
1

서버 인증에 서버를 구현하여 메시지의 레이블을 수정하려고하므로 다른 것들 (읽기/쓰기)을 수행 할 수있는 권한을 부여하는 GMAIL_MODIFY 범위가 필요합니다. 이 변경을 구현할 때 첫 번째 요청을 시도하자마자 NullPointerException이 발생합니다.Gmail API : 범위 GMAIL_READONLY는 작동하지만 GMAIL_MODIFY는 작동하지 않습니다. 왜 그런가요?

간단히하기 위해 Gmail 계정의 간단한 목록 코드 목록을 사용하고 있습니다.

내 계정의 개발자 콘솔과 모든 재즈에서 프로젝트를 설정했습니다.

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

     Collection<String> scopesArray = new ArrayList<String>(); 
     scopesArray.add(GmailScopes.GMAIL_MODIFY); 
     //scopesArray.add(GmailScopes.GMAIL_READONLY); 
     { 

      try { 
       httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
       credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(email_address) 
       .setServiceAccountPrivateKeyFromP12File(new File("myfile.p12")) 
       .setServiceAccountScopes(scopesArray) 
       .setServiceAccountUser(USER) 
       .build(); 
      } 
      catch (IOException | GeneralSecurityException e) 
      { 
       throw new RuntimeException(e); 
      } 

     } 


    // Create a new authorized Gmail API client 
    Gmail service = new Gmail.Builder(httpTransport, JSON_FACTORY, credential) 
     .setApplicationName(APP_NAME).build(); 

    try { 

     ListThreadsResponse threadsResponse = service.users().threads().list(USER).execute(); 
     List<com.google.api.services.gmail.model.Thread> threads = threadsResponse.getThreads(); 
     for (com.google.api.services.gmail.model.Thread thread : threads) { 
      System.out.println("Thread ID: " + thread.getId()); 
     } 


    } catch (GoogleJsonResponseException e) { 
     GoogleJsonError error = e.getDetails(); 
     System.err.println("Error code: "+ error.getCode()); 
     System.err.println("Error message: " + error.getMessage()); 
    } catch (HttpResponseException e) { 
     // No Json body was returned by the API. 
     System.err.println("HTTP Status code: "+ e.getStatusCode()); 
     System.err.println("HTTP Reason: " + e.getMessage()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

이 반환 : 스레드 "주요"java.lang.NullPointerException이 에서 예외 com.google.api.client.repackaged.com.google.common에서

여기 내 자바 코드입니다. base.Preconditions.checkNotNull (Preconditions.java:191) (com.google.api.client.util.Preconditions.checkNotNull (Preconditions.java:127) , com.google.api.client.json.jackson2.JacksonFactory). createJsonParser (JacksonFactory.java:96) at com.google.api.client.json.JsonObjectParser.parseAndClose (JsonObjectParser.java:85) com.google.api.client.json.JsonObjectParser.parseAndClose (JsonObjectParser.java:81) 에서 com.google.api.client.auth.oauth2.TokenResponseException.from (TokenResponseException.java:88) at com.google .api.client.auth.oauth2.TokenRequest.executeUnparsed (TokenRequest.java:287) (com.google.api.client.auth.oauth2.TokenRequest.execute (TokenRequest.java:307) , com.google.api) .client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken (GoogleCredential.java:268) (com.google.api.client.auth.oauth2.Credential.refreshToken (Credential.java:489) , com.google.api) .client.auth.oauth2.Credential.intercept (Credential.java:217) (com.google.api.client.http.HttpRequest.execute (HttpRequest.java:859) , com.google.api.client.googleapis) . AbstractGoogleClientRequest.executeUnparsed (AbstractGoogleClientRequest.java:410) com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed (AbstractGoogleClientRequest.java:343) com.google.api.client.googleapis.services. AbstractGoogleClientRequest.execute (AbstractGoogleClientRequest.java:460) core.crescent.gmail.GmailApiQuickstart.main (GmailApiQuickstart.java:228)에서

나는 그것이 작동 범위 GMAIL_READONLY 범위를 사용

. GMAIL API 문서에 따라 작업 범위 ( https://developers.google.com/gmail/api/v1/reference/users/threads/list)에 따라 변경되는 이유는 무엇입니까?

고맙습니다.

+0

이 링크 확인 http://stackoverflow.com/questions/24274297/java-lang-nullpointerexception-while-trying-to-run-google-driver-example – SGC

+0

감사합니다. 당신은 응답을 위해. 내가 설명하는 문제는 인증에 대한 것보다 사용자 계정에 대한 읽기/쓰기 권한을 더 많이 수행해야한다는 것입니다. – HBizzle

답변

0

예 같은 문제가 발생했습니다. 또한 @ gmail.com 계정에 액세스하고 전자 메일을 읽은 다음 레이블을 제거하고 추가 할 수있는 서비스 계정을 만들어야했습니다. 이것은 단순한 것으로 가정되었지만 범위 수정을 적용하면 오류가 발생합니다. 나는 최신 1.20을 철저히 분석해 보았으나 표시된 오류 이외의 차이는 만들지 않았다. Preconditions.checkNotNull (Preconditions.java:191)을 보는 대신 401 인증 오류가 표시됩니다. 이것은 서버 측에서 서비스 계정 범위가 @ gmail.com 계정을 수정할 수 없다는 것을 생각하게 만듭니다.

나는 다른 방향에서 일을 시도 했으므로 Google API 콘솔을 통해 도메인을 호스팅하는 자체 gmail을 가지고 API, 액세스, p12 등을 다시 만들었습니다. Gmail.api 액세스와 충분한 권한을 부여 했으므로, 같은 오류가 발생했습니다 : 401.""이 도메인 관리 ","고급 옵션 ">"API 클라이언트 액세스 관리 "에서 두 개의 범위를 읽고 수정하는 서비스 계정 전자 메일을 넣습니다. 여전히 효과가 없었습니다. 마지막으로 "security"> "advance options"> "이 도메인에 대한 OAuth 키 및 비밀 번호 관리"아래에 한 가지 설정이 추가되어 "Two-legged OAuth 액세스 제어"가 활성화되고 Youreka It worked! 내 서비스 계정이 이제 라벨 추가 및 제거 중입니다.

+0

Google Developers Console에 있는데 링크/옵션이 표시되지 않습니다. 나 또한 구글 애플 리케이션 호스트 도메인을 가지고 있지 않습니다. 어쨌든 Two-legged OAuth 폼 개발자 콘솔을 사용할 수 있습니까? 응답 주셔서 감사합니다, 그것은 내게 희망을주고 있어요. – HBizzle

관련 문제