クライアント側のserviceAccounts.keys.create
Google IAM APIを使用してGAEで生成されたサービスアカウントキーを使用して、GCSにファイルをアップロードしています。このAPIは、次のように私は、クライアント側のコードで使用していますprivateKeyData
フィールドを返します。しかしJavaのクライアント側でserviceAccounts.keys.create APIを使用して生成されたGoogleクラウドプラットフォームのサービスアカウントキーの使用方法は?
public class GCSTest {
public static final String CLOUD_STORAGE_SCOPE =
"https://www.googleapis.com/auth/cloud-platform";
private GoogleCredential credential = null;
private HttpTransport HTTP_TRANSPORT = null;
private Storage storage = null;
private final JsonFactory json_factory = JacksonFactory
.getDefaultInstance();
public String APPLICATION_NAME = "GCSTest";
private String privKeyString =
<copy the privateKeyData from response of serviceAccounts.keys.create>;
public void startTests() {
initStorageService();
writeObject();
}
private void initStorageService() {
List<String> scopeList = new ArrayList<String>();
scopeList.add(CLOUD_STORAGE_SCOPE);
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
byte[] privKeyBytes = Base64.decodeBase64(privKeyString.getBytes());
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privKeyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(spec);
credential =
new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(json_factory)
.setServiceAccountId(
"<service_account_name>@<project-id>.iam.gserviceaccount.com")
.setServiceAccountScopes(scopeList)
.setServiceAccountPrivateKey(privateKey)
.setServiceAccountPrivateKeyId(
"<key_id>")
.build();
storage =
new Storage.Builder(HTTP_TRANSPORT, json_factory,
credential).setApplicationName(APPLICATION_NAME)
.build();
}
private void writeObject() {
String fileName = "StorageSample";
Path tempPath = Files.createTempFile(fileName, ".txt");;
Files.write(tempPath, "Sample file".getBytes());
File tempFile = tempPath.toFile();
tempFile.deleteOnExit();
InputStreamContent contentStream =
new InputStreamContent("text/plain", new FileInputStream(
tempFile));
contentStream.setLength(tempFile.length());
StorageObject objectMetadata = new StorageObject().setName(fileName);
Storage.Objects.Insert insert =
storage.objects().insert(<bucket_name>,
objectMetadata, contentStream);;
insert.setName(fileName);
insert.execute();
}
}
をstorage.objects().insert
が呼び出されたとき、私はjava.security.InvalidKeyException: invalid key format exception
を取得します。 サービスアカウントキーを使用してGoogleCredential
を生成する正しい方法ですか? P.S:JSONまたはP12キーファイルについて知っています。私はそれが私のユースケースに適合しないので、それを使用したくない。
ありがとうを取得するために使用することができます。私は 'TYPE_PKCS12_FILE'を使ってキーを生成しましたが、' java.security.InvalidKeyExceptionが発生しました:IOException:バージョンの不一致:(サポートされている:00、解析済み:03'のエラーです。 –