2017-11-21 9 views
0

Google Cloud Storage에 파일을 보내야하는 애플리케이션을 개발 중입니다.사용자 확인없이 파일을 GCS에 보내는 가장 좋은 방법은

webapp에는 사용자가 업로드 할 파일을 선택하는 HTML 페이지가 있습니다.

사용자는 Google 계정이 없습니다.

전송할 금액 파일이 5 개 이하입니다.

파일을 GAE에 보내지 않고 GAE가 GCS에 보내려합니다. 내 사용자가 직접 GCS로 업로드하길 바랍니다.

나는 업로드이 코드를했다 :
function sentStorage() { 
      var file = document.getElementById("myFile").files[0]; 
      url = 'https://www.googleapis.com/upload/storage/v1/b/XXX/o?uploadType=resumable&name=' + file.name; 
      xhr = new XMLHttpRequest(); 

      var token = 'ya29.XXXXXXXXXXXXXXX'; 
      xhr.open('POST', url); 
      xhr.setRequestHeader('Content-Type', file.type); 

      // resumable 
      //url = 'https://www.googleapis.com/upload/storage/v1/b/XXXXXX/o?uploadType=resumable&name=' + file.name; 
      //xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); 
      //xhr.setRequestHeader('Content-Length', file.size); 


      xhr.setRequestHeader('x-goog-project-id', 'XXXXXXXXXX'); 
      xhr.setRequestHeader('Authorization', 'Bearer ' + token); 

      xhr.send(file); 

      xhr.onreadystatechange = function() { 
       if (xhr.readyState === 4) { 
        var response = JSON.parse(xhr.responseText); 
        if (xhr.status === 200) { 
         alert('codigo 200'); 
        } else { 
        var message = 'Error: ' + response.error.message; 
        console.log(message); 
         alert(message); 

        } 
       } 
      }; 
     } 

가 나는 serviceaccount 정보 (구글 콘솔)를 취득하고 그것을 위해 토큰 베어러를 생성합니다. "json 계정 정보"를 읽고 토큰을 생성하는 파이썬 파일을 사용했습니다.

필자는 사용자가 파일 전송에 대한 Google 계정 정보를 확인하지 않아도된다는 요구 사항이 내 신청서의 의무 사항입니다. (사용자는 Google 계정이 없음) HTML 페이지는 GAE 또는 GCE로 전송하지 않고 파일을 GCS로 직접 보내므로 HTML 양식이나 Javascript를 사용해야합니다. 나는 자바 스크립트를 선호한다. 이 응용 프로그램의 사용자 만 업로드 할 수 있습니다 (응용 프로그램은 데이터베이스와의 인증을 갖습니다). 따라서 익명 사용자는이를 수행 할 수 없습니다.

내 질문은 :

  • 이 토큰의 유효 기간은 언제까지입니까? 이 토큰을 생성하기 위해 serviceaccount를 사용했습니다.
  • 더 좋은 API 자바 스크립트가 있나요?
  • 이 보안 솔루션이 더 좋습니까? 아니면 다른 접근 방식을 사용해야합니까?

답변

1

신뢰할 수없는 최종 사용자에게 새로 고침 또는 액세스 토큰을 보내는 것은 매우 위험합니다. 액세스 토큰의 베어러는 몇 분 후 액세스 토큰이 만료 될 때까지 관련 계정 (해당 계정 생성에 사용 된 범위 내)으로 작동 할 수있는 완전한 권한을가집니다. 당신은 그렇게하고 싶지 않습니다.

몇 가지 대안이 있습니다. 가장 쉬운 방법은 원하는 업로드 요청을 정확하게 작성한 다음 서비스 계정의 개인 키를 사용하여 해당 요청의 URL에 서명하는 것입니다. 몇 분 동안 유효하게 될 서명 된 URL은 단일 객체를 업로드하는 데 사용될 수 있습니다. 고객에게 제공하기 전에 서버 측에서 URL에 서명해야합니다. 서명 된 URL에 대한 문서는 다음과 같습니다. https://cloud.google.com/storage/docs/access-control/signed-urls

+0

설명해 주셔서 감사합니다. "서명 된 URL"에 대해 읽었으며 지금 사용 중입니다! GCS로 파일을 보내고 가져 와서 내 github에 넣는 응용 프로그램을 만들었습니다. 현재 위치 : https://github.com/charlesasilva61/gcs-java-signed-url – javaTry