2

AppEngineでGoogleCloudStorageを使用していて、POSTフォームを使用してファイルをGCSにアップロードしようとしています。私が抱えている問題は、ポリシー文書に署名するために必要な手順にあります。client_secrets.jsonAPIコンソールから提供された文字列であるclient_secretを簡単に取得できます。ただし、署名を作成するには、その文字列をPrivateKeyオブジェクトに変換する必要があります。私のコードは次のようになります。

//create the policy document and encode it
String policyDocument = ...  //omitted for brevity
String encodedPolicy = Base64.encodeString(policyDocument);

//sign using SHA256 with RSA
String secretKey = ... //I fetch this from client_secrets.json
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(secretKey); //THIS IS THE PROBLEM!  
sig.update(encodedPolicy.getBytes("UTF-8"));        
String signature = new String(Base64.encode(sig.sign()));

//put the values in the request attributes so we can fetch them from a JSP
req.setAttribute("policy", encodedPolicy);
req.setAttribute("signature", signature);

上記のように、私の問題はラインにあります

sig.initSign(secretKey); //THIS IS THE PROBLEM!  

secretKey文字列です。 、またはその子孫オブジェクトの1つをSignature.initSign()期待します。の文字列を、渡すことができるPrivateKey(または派生)オブジェクトPrivateKeyに変換するにはどうすればよいですか?client_secrets.jsonSignature.initSign

どんな助けでも大歓迎です。ありがとう

OK、これが私が今いるところです。以下の提案を試しましたが、すべてのドキュメントで、サービスアカウントではなく、GoogleAPIコンソールからダウンロードしたclient_secrets.jsonファイルのclient_secretを使用するように求められています。さらに、サービスアカウントではなく、ユーザーのアップロードの例を作成しようとしています。

別のページで次のコードを見つけました。

public static String signPolicyDocument(String policyDocument, String secret) {     
try {
        Mac mac = Mac.getInstance("HmacSHA256");
        byte[] secretBytes = secret.getBytes();
        SecretKeySpec signingKey = new SecretKeySpec(secretBytes, "HmacSHA256");
        mac.init(signingKey);
        byte[] signedSecretBytes = mac.doFinal(policyDocument.getBytes());          
        return new String(Base64.encode(signedSecretBytes));
    } catch (InvalidKeyException e) {
        throw new RuntimeException(e);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

そして、それは私がプロセス全体を通して私を取得します...私が結果のフォームを提出するまで。次に、次の応答があります。

The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.

どのような署名方法を探していますか?

4

3 に答える 3

1

この問題に対する最終的な答えは、Wargamesの結論のようなものです。WOPRが言ったように、「奇妙なゲーム...勝つための唯一の方法はプレーしないことです。」署名やポリシー文書などを避け、blobstoreを使用してください。

(これを参照してください: https ://developers.google.com/appengine/docs/java/blobstore/overview#using-blobstore-with-gcs )

実装は非常に簡単です。次のように一時的なblobstoreアップロードURLを作成する場合:

    //open the blobstore service and create the upload url
    BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService();        
    String uploadUrl = bs.createUploadUrl("/display",
            UploadOptions.Builder.withGoogleStorageBucketName(bucket));

このアプローチの欠点は、オブジェクト名が認識できない文字列になることです。ブロブストアビューアを開いて、ブロブストア内のファイル名でオブジェクトを表示できますが、GCSではそのオブジェクト名はgobbledygookになります。(ハッシュ、多分?ランダムに割り当てられたID)?

于 2013-02-28T00:19:33.500 に答える
1

これがあなたがする必要があると私が思うことです:

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
sig.initSign(privateKey);

keyBytes変数には、サービスアカウントキーファイルを含む配列byte[]含まれている必要があります。

于 2013-02-26T20:39:25.943 に答える
0

AppengineからGCSにファイルをアップロードするには、blobstoreApiを使用できます。GCSでのBlobstoreの使用で説明されている手順に従います。利点は、キーについて心配する必要がなく、コードがはるかに単純なことです。

于 2013-02-27T18:42:14.683 に答える