[Cloud Storage API(V2)] JavaでCloud StorageのHMACキー情報を作成・更新・削除する

Cloud Storage API V2(Java)を使用して、
Cloud StorageのHMACキー情報を作成・更新・削除する方法
についてご紹介します。

**HMACキーとは**
アカウントに関連付けられた認証情報の一種です。 
HMACキーを使用して署名を作成すると、その署名がCloudStorageに対するリクエストに組み込まれます。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d)
を参照ください。
:::

|No|||目次|
|---|---|---|---|
|1|||[HMACキーリストを作成](#1-hmacキーリストを作成)|
||1||[スコープ](#11-スコープ)|
||2||[実行](#12-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|
|2|||[HMACキーを更新](#2-hmacキーを更新)|
||1||[スコープ](#21-スコープ)|
||2||[実行](#22-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|
|3|||[HMACキーを削除](#3-hmacキーを削除)|
||1||[スコープ](#31-スコープ)|
||2||[実行](#32-実行)|
||3||[レスポンスの内容](#33-レスポンスの内容)|

## 1. HMACキーリストを作成
指定したプロジェクトのHMACキーを作成します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.DEVSTORAGE_FULL_CONTROL
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Storage storage = getStorage();
    Storage.Projects projects = storage.projects();
    
    Storage.Projects.HmacKeys hmacKeys = projects.hmacKeys();
    Storage.Projects.HmacKeys.Create create = hmacKeys.create("プロジェクトID","サービスアカウントのメールアドレス");
    
    HmacKey res = create.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST :　https:\//storage.googleapis.com/storage/v1/projects/{プロジェクトID}/hmacKeys
が実行されます。

#### 1.2.2. クエリパラメータ
Storage.Projects.HmacKeysのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setServiceAccountEmail|String|サービスアカウントのメールアドレス|

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容
#### HmacKey
|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："storage#hmacKey"|
|getSecret|String|HMAC秘密鍵のマテリアル|
|getMetadata|[HmacKeyMetadata](#hmackeymetadata)|HMACキーのメタデータ|

#### HmacKeyMetadata
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|HMACキーID|	
|getKind|String|リソースの種類<br>固定文字列："storage#hmacKeyMetadata"|
|getAccessId|String|HMACキーのアクセスID|	
|getEtag|String|HMACキーのHTTPエンティティタグ|	
|getSelfLink|String|リソースへのリンク|
|getProjectId|String|キーが認証するサービスアカウントを所有するプロジェクトID|	
|getServiceAccountEmail|String|キーに関連付けられたサービスアカウントのメールアドレス|	
|getState|String|キーの状態<br>"ACTIVE"、"INACTIVE"、"DELETED"|
|getTimeCreated|DateTime|HMACキーの作成時刻|
|getUpdated|DateTime|HMACキーメタデータの更新時刻|

## 2. HMACキーを更新
指定したHMACキーのメタデータを更新します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.DEVSTORAGE_FULL_CONTROL
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
HMACキーのアクセスIDは、[HmacKeyMetadata](#hmackeymetadata)のgetAccessId()で取得できる値を使用します。

```java
public static void main(String[] args) throws Exception{
    Storage storage = getStorage();
    Storage.Projects projects = storage.projects();
    Storage.Projects.HmacKeys hmacKeys = projects.hmacKeys();
    
    HmacKeyMetadata content = new HmacKeyMetadata();
    //更新内容を設定
    
    Storage.Projects.HmacKeys.Update update = hmacKeys.update("プロジェクトID","HMACキーのアクセスID",content);
    
    HmacKeyMetadata res = update.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
PUT:　https:\//storage.googleapis.com/storage/v1/projects/{プロジェクトID}/hmacKeys/{HMACキーのアクセスID}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストパラメータ
HmacKeyMetadataのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setEtag|String|更新するHMACキーのHTTP1.1エンティティタグ<br>(一致しない場合は更新されません)|
|setState|String|キーの状態<br>"ACTIVE"、"INACTIVE"、"DELETED"|

### 2.3. レスポンスの内容
#### HmacKeyMetadata
[2.3. レスポンスの内容(HmacKeyMetadata)](#hmackeymetadata)と同じです。

## 3. HMACキーを削除
指定したHMACキーを削除します。

キーの状態（[2.2.3. リクエストパラメータのstate](#223-リクエストパラメータ)）が
"ACTIVE"の状態では削除することはできません。
削除するにはstateを"INACTIVE"に変更してください。

### 3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.DEVSTORAGE_FULL_CONTROL
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 3.2. 実行
HMACキーのアクセスIDは、[HmacKeyMetadata](#hmackeymetadata)のgetAccessId()で取得できる値を使用します。

```java
public static void main(String[] args) throws Exception{
    Storage storage = getStorage();
    Storage.Projects projects = storage.projects();
    Storage.Projects.HmacKeys hmacKeys = projects.hmacKeys();
    
    Storage.Projects.HmacKeys.Delete delete = hmacKeys.delete("プロジェクトID","HMACキーのアクセスID");
    
    delete.execute();
}
```
#### 3.2.1. HTTPリクエスト
DELETE:　https:\//storage.googleapis.com/storage/v1/projects/{プロジェクトID}/hmacKeys/{HMACキーのアクセスID}
が実行されます。

#### 3.2.2. クエリパラメータ
クエリパラメータはありません。

#### 3.2.3. リクエストボディ
リクエストボディはありません。

### 3.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合は例外が発生します。

<br>
<br>
おしまい。。