5

Ho un'app per Android che alla fine memorizzerà i contenuti generati dagli utenti in un bucket di Google Cloud Storage. Ma non sono in grado di farlo dal mio codice app. Il codice è simile al seguente:Autentica come account di servizio dall'app Android per Google Cloud Storage

JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
KeyStore keystore = SecurityUtils.getPkcs12KeyStore(); 
keystore.load(resources.openRawResource(R.raw.secret), "***password***".toCharArray()); 
PrivateKey key = (PrivateKey)keystore.getKey("privatekey", "***password***".toCharArray()); 
credential = new GoogleCredential.Builder() 
.setTransport(httpTransport) 
.setJsonFactory(new JacksonFactory()) 
.setServiceAccountPrivateKey(key) 
.setServiceAccountId("**************@developer.gserviceaccount.com") 
.setServiceAccountScopes(Collections.singleton(StorageScopes.DEVSTORAGE_READ_WRITE)) 
.build(); 
credential.refreshToken(); 
String URI = "https://storage.googleapis.com/"+BUCKET_NAME; 
HttpRequestFactory requestFactory = httpTransport.createRequestFactory(credential); 
GenericUrl url = new GenericUrl(URI); 
HttpRequest request = requestFactory.buildGetRequest(url); 
HttpResponse response = request.execute(); 
String content = response.parseAsString(); 
Log.d("testing", "response content is: " + content); 
new Storage.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("Doubts").build(); 

Ricevo vari errori. Uno di questi è:

java.security.KeyStoreException: java.security.NoSuchAlgorithmException: KeyStore JKS implementation not found 

La documentazione ufficiale ignora semplicemente il caso di utilizzo da un'app Android.

+1

binaryking> Anche se questo ha funzionato - vuoi incorporare la chiave privata/password all'interno della vostra applicazione android ?? – Jasper

risposta

1

Suggerirei di assumermi la responsabilità di autorizzare la richiesta via dal client Android, in quanto non è considerato un client "affidabile".

Una buona pratica da seguire sarebbe quella di generare un lato server URL firmato e inviarlo al client in modo che quest'ultimo possa utilizzarlo per caricare file nei propri bucket in modo sicuro e opaco. In questo modo eliminerai anche la complessità e l'esposizione alle credenziali naturalmente private dei tuoi clienti.

Si possono trovare informazioni sugli URL firmati nel official docs