2014-02-08 5 views
4

Google Cloud Storage + Google App Engine (Python) 'Hello world'앱을 실행하려고합니다.GAE Python + Google Cloud Storage 인증 문제

Google Cloud Storage 활성화 지침을 따라 App Engine 애플리케이션 콘솔에서 버킷을 만들었습니다. 필자는 테스트 파일을 작성하는 간단한 프로그램을 작성했지만 실행하면 클라우드 저장소 라이브러리가 403을 던졌습니다. App Engine 앱의 자격 증명이 제시되지 않았거나 유효하지 않거나 없기 때문입니다. 이 양동이에 대한 권리. 여기

코드입니다 :

BUCKET = '/pcj-info-testing' 

class TestGCS(webapp2.RequestHandler): 
    def create_file(self, filename): 
    self.response.write("Creating\n"); 
    gcs_file = gcs.open(filename, 'w', content_type = 'text/plain'); 
    gcs_file.write('Testing, 1, 2, 3\n') 
    gcs_file.write('At ' + datetime.now().isoformat())  
    gcs_file.close() 

    def get(self): 
    self.response.headers['Content-Type'] = 'text/plain' 
    filename = BUCKET + "/demo-file" + str(random.randrange(10**10, 10**11-1)) 
    self.create_file(filename) 
    self.response.write('File stat:\n') 
    stat = gcs.stat(filename) 
    self.response.write(repr(stat)) 

여기 스택 추적 및 오류의 관련 부분입니다 :

File "/base/data/home/apps/s~pcj-info/1.373629132682543570/gcstest.py", line 14, in create_file 
    gcs_file = gcs.open(filename, 'w', content_type = 'text/plain'); 
    File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/cloudstorage_api.py", line 74, in open 
    return storage_api.StreamingBuffer(api, filename, content_type, options) 
    File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/storage_api.py", line 597, in __init__ 
    errors.check_status(status, [201], path, headers, resp_headers) 
    File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/errors.py", line 106, in check_status 
    raise ForbiddenError(msg) 
ForbiddenError: Expect status [201] from Google Storage. But got status 403. 
Path: '/pcj-info-testing/demo-file16955619179'. 
Request headers: {'x-goog-resumable': 'start', 'x-goog-api-version': '2', 'content-type': 'text/plain', 'accept-encoding': 'gzip, *'}. 
Response headers: {'alternate-protocol': '443:quic', 'content-length': '146', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'vary': 'Origin', 'server': 'HTTP Upload Server Built on Jan 23 2014 15:07:07 (1390518427)', 'date': 'Sat, 08 Feb 2014 16:49:56 GMT', 'content-type': 'application/xml; charset=UTF-8'}. 
Extra info: None. 

내가 버킷에 대한 액세스 권한을 검토 한 결과, 그들은보고 올바른지 (문서에 따라 기본값으로 올바르게 작성 되었어야 함) - Google APIs Console에 광산으로 나열된 ID는 소유자 권한과 함께 버킷 권한에서와 동일합니다.

Google이 Status Codes documentation에서 403을 반환 할 수있는 이유를 알 수 있지만 호출 할 수있는 App Engine의 urlfetch 라이브러리는 내가 알 수있는 한이 오류 이름을 반환하지 않습니다. 오류 코드 바로 뒤에 HTTP 응답에서 반환 된 텍스트 문자열이지만 라이브러리는 정수 결과 만 제공합니다.) 그래서 나는 다음에 무엇을 해야할지를 놓치고 있습니다.

API에서 반환하는 오류를 캡처하는 간단한 방법이 있습니까? AccountProblem 대 InvalidSecurity 또는 뭔가 오류인지 알면 내 문제 해결이 크게 달라질 수 있습니다. 지원되는 클라우드 개발 플랫폼에서 권장 라이브러리를 사용하는 사용자가 액세스 할 수없는 방식으로 API가 오류 코드를 반환하는 것은 매우 실망 스럽습니다.

"모든 인증 된 사용자"에게 쓰기 액세스 권한을 부여하면 작동합니다. 그래서 내가 누군가로 인증하는 것처럼 보이지만 그 사람이 권한 목록에없는 것 같습니다. 앱을 테스트하는 동안 로그인 한 Gmail 계정을 추가해도 도움이되지 않습니다. 앱에서 모든 URL을 조회하려면 관리자 로그인이 필요합니다.

+0

oauth로 앱을 승인하셨습니까? –

+1

나는 가지고 있지 않았다; AppEngine 문서는 승인 된 것으로 앱을 식별하는 자격증 명을 자동으로 전달한다고하지만 분명히 불완전합니다. @ jterrace의 대답이 저에게 효과적이었습니다. 감사. –

답변

4

쓰기 권한이있는 것으로 appengine 서비스 계정을 추가해야합니다.

"서비스 계정 이름"아래 App Engine 콘솔의 "응용 프로그램 설정"에서 서비스 계정 전자 메일을 찾을 수 있습니다.

+0

대단히 고마워! 간과 한 부분이 간과되어 있거나 내 좌절감이 의롭다는 것을 알 수 있습니까? 클라우드 스토리지 클라이언트 API 문서 또는 링크 된 페이지의 어느 곳에서도 찾을 수 없습니다. –

+0

방금이 문제를 발견했으며 Google Bucket 권한에 서비스 계정을 추가해야했습니다. 기본 버킷은 App Engine에 대한 모든 올바른 권한으로 생성되지 않습니다. – user1961

관련 문제