Przekształć clientsecret w klucz prywatny

Pracuję z Google Cloud Storage w AppEngine i próbuję użyć formularza POST, aby przesłać plik do GCS. Problem, który mam, dotyczy kroków niezbędnych do podpisania dokumentu polityki. Mogę łatwo pobrać client_secret, czyli String zclient_secrets.json dała mi konsola API. jednak, aby utworzyć podpis, muszę przekonwertować ten ciąg naPrivateKey obiekt. Oto jak wygląda mój kod:

//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);

Jak wspomniano powyżej, mój problem jest na linii

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

secretKey jest ciągiem.Signature.initSign() oczekuje aPrivateKeylub jeden z jego obiektów potomnych. Jak przekonwertować ciąg wclient_secrets.json do obiektu PrivateKey (lub pochodnego), który mogę przekazaćSignature.initSign?

Każda pomoc byłaby bardzo mile widziana. Dzięki

OK, oto gdzie jestem teraz. Wypróbowałem poniższe sugestie, a cała dokumentacja nakłania mnie do użycia client_secret w pliku client_secrets.json pobranym z konsoli Google API,nie konto usługi. Poza tym próbuję skonstruować przykład przesyłania użytkownika, a nie konto usługi.

Znalazłem następujący kod na innej stronie:

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);
    }

I to prowadzi mnie przez cały proces ... dopóki nie prześlę wynikowego formularza. Wtedy otrzymuję następującą odpowiedź:

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

Jakiej metody podpisywania szuka?

questionAnswers(3)

yourAnswerToTheQuestion