문제

나는 구글 드라이브를 사용하려고 노력하고있다. 앱 아이덴티티 구글 앱 엔진과 함께 제공되는 인터페이스.이것은 기본적으로 내 웹 응용 프로그램이 구글과 통신 할 수 있습니다 서버에서 서버로.

나는 단순히 내 자신의 구글 드라이브 문서를 표시 할 필요가,로그인 내 사용자가 필요하지 않습니다.

그러나 모든 적절한 값과 범위를 설정하고 콘솔 페이지의 모든 올바른 구글 드라이브 노브를 활성화 한 후에도 간단한 요청을 위해 이것을 얻을 수 있습니다 https://www.googleapis.com/drive/v2/files:

{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}

무슨 일이야?나는 무엇을 놓치고 있습니까?이 응용 프로그램은 당신이 원하는 모든 것을 찾을 수 있습니다.:

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());

편집

만약 제가 단순히 urlshortner 예를 들어,그것은 작동합니다:

var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

그리고 산출:

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

그래서 구글 드라이브 및 응용 프로그램의 정체성과 함께 작동하지 뭔가가 있어야합니다?

편집 2

나는 여기에 정답에서 몇 가지 도움을 발견했습니다: https://stackoverflow.com/a/12526286/50394

그리고 나는 구글 앱을 사용하지 않고 단순히 구글 앱 엔진의 도메인을 사용하고 있습니다 foo.appspot.com

도움이 되었습니까?

해결책

얻는 403 오류는 귀하의 얻을 수있는 권한 헤더가 없음을 의미합니다.논리는 권한 헤더가 없으면 익명으로 (당신이 군단 Blah blah :-))입니다.익명 사용을위한 드라이브 할당량은 0이므로 메시지가 있습니다.URL 쇼발기는 익명으로 더 높은 할당량을 가지므로 작동합니다.

URL이 자신의 HTTP 서버를 가리키는 URL을 변경하고 실제로 보내는 헤더를 확인합니다.

다른 팁

당신이 사용해야하는 경우 Bearer 권한 부여 헤더에 있습니다.

아마도 무슨 일이 일어나고 있는지는 서비스 계정을 인식하지 못합니다(잘못된 헤더 때문에?)따라서 익명 요청으로 간주합니다. key 매개 변수도 제공되지 않았습니다(참조 공통 쿼리 매개 변수).

이 시도:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

또는 토큰을 다음과 같이 추가 할 수 있습니다 access_token 쿼리 매개 변수.

적어도 https : // 코드에서 드라이브 API를 사용하는 API 콘솔 항목을 적어도 설치해야한다고 생각합니다.google.com/apis/console 이 작업을 생성하면 GoogLecredential 객체에서 사용할 수있는 ID가 나타납니다.GoogleCredential 객체에서 요청에 추가하는 것보다 할 수있는 액세스 토큰을 얻을 수 있습니다.

여기에서 읽은 것 ( 서비스 계정을 통해 Google 드라이브) 개발자 콘솔에서 검색 한 API 키를 사용하는 약간 다른 스타일을 사용하십시오.
저에게 적절한 부분은 "서버 응용 프로그램의 키"를 생성 한 다음이 기술을 사용하여 다른 곳에서 를 읽지 못했습니다!

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();
.

답변 주장 :

서비스 계정은 C 드라이브가 지원되지 않습니다. 보안 모델.

여전히 사실이면 정기적 인 Google 계정으로 한 번 정규 OAuth 댄스를 수행하고 데이터 저장소의 액세스 및 새로 고침 토큰을 유지하는 것입니다.

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