문제

사용자를 가장하고 서버 프로세스를 대신하여 사용자에게 Google 드라이브에 파일을 추가하고 싶습니다.서비스 계정을 설치하고 다음 코드를 사용하여 파일 추가 및 목록 등을 서비스 계정으로 성공적으로 액세스 할 수 있습니다.

  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  public static void main(String[] args) {
    try {
        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .build();
        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();         
        drive.files().list().execute();
  } catch (Exception e) {
     e.printStackTrace();
  }
.

이 작동은 내가 가정하는 것과 관련된 파일 만 서비스 계정 드라이브 (?)와 연관된 파일 만 반환합니다.

Javadoc에 따르면 GoogLecredential은 다음과 같이 서비스 계정 사용자 이메일 주소를 추가하여 사용자를 가장하여 사용자를 가장하는 데 사용할 수 있습니다.

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("usera@domain.com") //<-- impersonate user a
                  .build();
.

그러나이 코드를 실행할 때 다음 예외가 throw됩니다 :

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "access_denied"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:508)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:260)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:796)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:198)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071)
.

단계 또는 구성 설정이 누락 되었습니까?

고마워, 데이비드

도움이 되었습니까?

해결책

나는 광산과 비슷한 질문을 발견했다. Google Apps 관리자가 드라이브 SDK로 사용자 파일을 관리 할 수 있습니까? 답변을 알아내는 데 도움이되는 것

CPANEL 문서는 소비자 키를 사용하는 것을 참조하고 API 클라이언트 액세스 화면에 도메인을 추가하는 것을 참조하므로 약간 오해가 있습니다.이것은 새로운 Google 드라이브 API가 아닌 GDATA API에 유효한 것으로 보입니다.다른 질문에 제안 된 클라이언트 ID를 추가하고 드라이브 범위에 대한 액세스 권한을 부여하면 이제 사용자를 가장 할 수 있습니다.

다른 팁

관리자를 통해 xxxxx.apps.googleusercontent.com에 스코프를 추가하도록 관리자를 가져옵니다.

스프레드 시트에서 작업하려면 다음을 추가했습니다.

https://www.googleapis.com/auth/drive https://docs.google.com/feeds https://spreadsheets.google.com/feeds

elegate OAuth 권한 범위

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top