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 aPrivateKey
lub 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?