1

Google Storageにファイルをアップロードするための署名付きURLの作成が苦労しています。署名する文字列を作成し、その後Google Storageにオブジェクトを配置する署名付きURLを作成する

AuthCredentials.ServiceAccountAuthCredentials serviceAccountAuthCredentials = AuthCredentials.ServiceAccountAuthCredentials.createForJson(json_resource.getInputStream()); 
PrivateKey key = serviceAccountAuthCredentials.credentials().getPrivateKey(); 
Signature signer = Signature.getInstance("SHA256withRSA"); 
signer.initSign(key); 

を:: まず、私はキーJSONを使用して、秘密鍵を取得し、CLIENTIDい

String upload_uri = "PUT\n\n" + expiration + 
       "\n/" + bucketName + "/" + folderPath + "/" + fileName; 

そして、署名文字列:

signer.update(stringToSign.getBytes("UTF-8")); 
byte[] rawSignature = signer.sign(); 
String signature = new String(Base64.encodeBase64(rawSignature, false), "UTF-8"); 

そして構成符号付き文字列を使用するURL:

final String clientId = serviceAccountAuthCredentials.account(); 
String url = "http://storage.googleapis.com/" + 
      bucketName + "/" + folderPath + "/" + fileName + 
      "?GoogleAccessId=" + clientId + 
      "&Expires=" + expiration + 
      "&Signature=" + URLEncoder.encode(signature, "UTF-8"); 
0このURLを使用

私はエラーを取得しています:私の側から以下の作業コードをチェックし

SignatureDoesNotMatchThe request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.GET 1485340222074 /bucketName/fileName

+0

stringToSignとgsutilのような標準的な例を同じURLで比較できますか?初心者の方は、PUTの後に\ nがないと思います(メソッド、md5、およびコンテンツタイプに1つが必要です)。 –

+0

提案ありがとう、@TravisHobrla。私はそれを試した - うまくいきませんでした。 contentTypeを追加しようとしました - どちらもうまくいきませんでした。 – nkat

+0

StringToSignが[正しい形式](https://cloud.google.com/storage/docs/access-control/signed-urls#string-components)に従っていること、有効期限がUnix Epochで正しく計算されていること、 [guide](https://cloud.google.com/storage/docs/access-control/create-signed-urls-program)に従って署名していることを確認してください。また、URLを使用するクライアントが、正しいヘッダー、具体的にはコンテンツタイプを設定していることを確認してください。 – Jordan

答えて

2

こんにちはしてください。私はgetやtokenとしていくつかのパラメータが欠けていると感じます: `

Calendar calendar = new GregorianCalendar(); 
      Long lExpireDate = Long.valueOf(calendar.getTime().getTime() + 7*86400000);//7 days validity 
      String strExpireDate = fromDateLongtoStringISO8601(lExpireDate); 

      String HTTP_Verb = "GET"; 
      String Content_MD5 = ""; 
      String Content_Type = "";//"image/jpeg"; 
      String Expiration = String.valueOf(lExpireDate/1000); 
      String Canonicalized_Resource = "/"+bucketName+"/"+objectName; 
      String StringToSign = HTTP_Verb + "\n" + 
        Content_MD5 + "\n" + 
        Content_Type + "\n" + 
        Expiration + "\n" + 
        Canonicalized_Resource; 


      byte[] blob = StringToSign.getBytes(); 
      String BASE_URL = "https://storage.googleapis.com"+Canonicalized_Resource; 

      ArrayList<String> scopes = new ArrayList<>(); 
      scopes.add(SQLAdminScopes.CLOUD_PLATFORM); 
      appIdentity = AppIdentityServiceFactory.getAppIdentityService(); 
      AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes); 

      AppIdentityService.SigningResult result = appIdentity.signForApp(blob); 
      byte[] signatureByte = result.getSignature(); 
      String urlEncoded = com.google.api.client.util.Base64.encodeBase64String(signatureByte); 
      String strURLBase64Encoded = URLEncoder.encode(urlEncoded); 

      String GOOGLE_ACCESS_STORAGE_ID = appIdentity.getServiceAccountName(); 
      //GOOGLE_ACCESS_STORAGE_ID contains the email form of the client ID. 

      String concatenatedURL = BASE_URL + "?GoogleAccessId=" + GOOGLE_ACCESS_STORAGE_ID 
        + "&Expires=" + strExpireDate 
        + "&access_token=" + URLEncoder.encode(accessToken.getAccessToken()) 
        + "&Signature=" + strURLBase64Encoded; 
      entity.setProperty(Media.URLD, concatenatedURL); 
+0

誰かがGoogleのクラウドストレージリサイズ関数get_serving_urlに署名したURLを関連付ける手掛かりがある場合は、 – mg3

+0

@ mp3を共有してください。get_serving_urlはApp Engine Flexに移動すると利用できないAPIに属します。それでもApp Engineの標準で使用できます。あなたがする必要があることは、ファイルがアップロードされた後に通知され、blobstoreService.createGsBlobKeyを使用すると、get_serving_urlで使用するblobキーを持つことができるようになります。アップロード時に通知を受け取るにはどうすればよいですか? GCSのpubsub通知(https://cloud.google.com/storage/docs/pubsub-notifications)、クラウド機能、あまり好ましくないウェブフックを使用できます。 –

関連する問題