[Gmail API] JavaでGmailクライアントサイド暗号化(CSE)を作成・更新・削除する

Gmail API v1（Java）を使用して、
Gmailクライアントサイド暗号化(CSE)を作成・更新・削除する方法
についてご紹介します。

**Gmailクライアントサイド暗号化とは**
メールデータをGoogleクラウドベースストレージ時に転送または保存する前に
ブラウザ内で暗号化を行う仕組みです。
送信先の相手が受信するまで、メールデータは保護されます。
これにより機密データや規制対象データのコンテンツの機密性保持を強化できます。

このAPIは、ドメイン全体の権限を委任されたサービスアカウントを
使用しての発行のみ利用可能です。
OAuth 2.0では利用できません。

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

|No||目次|
|---|---|---|
|1||[CSEを生成](#1-cseを生成)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[CSEを更新](#2-cseを更新)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[CSEを削除](#3-cseを削除)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|

## 1. CSEを生成
認証されたユーザーのクライアント側で暗号化されたIDを生成します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();
	
	Gmail.Users.Settings.Cse.Identities identities = settings.cse().identities();
	CseIdentity content = new CseIdentity();
	
	Gmail.Users.Settings.Cse.Identities.Create create = identities.create("メールアドレス",content);

	CseIdentity res = create.execute();
	System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/identities
が実行されます。

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

#### 1.2.3. リクエストボディ
CseIdentityのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setEmailAddress|String|メールアドレス|
|setPrimaryKeyPairId|String|キーペアID<br>setSignAndEncryptKeyPairs()とどちらか一方のみ指定可能|
|setSignAndEncryptKeyPairs|[SignAndEncryptKeyPairs](#signandencryptkeypairsset)|署名と暗号化に異なるキーペアを使用する構成<br>setPrimaryKeyPairId()とどちらか一方のみ指定可能|

#### SignAndEncryptKeyPairs(Set)

|メソッド|引数|説明|
|---|---|---|
|setSigningKeyPairId|String|送信メールに署名するID|
|setEncryptionKeyPairId|String|署名付き送信メールを暗号化するID|

### 1.3. レスポンスの内容

#### CseIdentity

|メソッド|戻り値|説明|
|---|---|---|
|getEmailAddress|String|メールアドレス|
|getPrimaryKeyPairId|String|キーペアID|
|getSignAndEncryptKeyPairs|[SignAndEncryptKeyPairs](#signandencryptkeypairs)|署名と暗号化に異なるキーペアを使用する構成|

#### SignAndEncryptKeyPairs

|メソッド|戻り値|説明|
|---|---|---|
|getSigningKeyPairId|String|送信メールに署名するID|
|getEncryptionKeyPairId|String|署名付き送信メールを暗号化するID|

## 2. CSEを更新
認証されたユーザーのクライアント側で暗号化されたIDを更新します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

更新したい構成のCSEメールアドレスを指定します。
[1. CSEを生成(CseIdentity)](#cseidentity)の
getEmailAddress()で取得した値を設定します。

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();
	
	Gmail.Users.Settings.Cse.Identities identities = settings.cse().identities();
	CseIdentity content = new CseIdentity();
	Gmail.Users.Settings.Cse.Identities.Patch patch = identities.patch("メールアドレス","CSEメールアドレス",content);

	CseIdentity res = patch.execute();
	System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
PATCH:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/identities/{CSEメールアドレス}
が実行されます。

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

#### 2.2.3. リクエストボディ
CseIdentityのsetメソッドにより、リクエストボディを追加できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

### 2.3. レスポンスの内容

#### CseIdentity

[1.3. レスポンスの内容(CseIdentity)](#cseidentity)と同じです。

## 3. CSEを削除
認証されたユーザーのクライアント側で暗号化されたIDを削除します。

### 3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 3.2. 実行

削除したい構成のCSEメールアドレスを指定します。
[1. CSEを生成(CseIdentity)](#cseidentity)の
getEmailAddress()で取得した値を設定します。

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();
	
	Gmail.Users.Settings.Cse.Identities identities = settings.cse().identities();
	Gmail.Users.Settings.Cse.Identities.Delete delete = identities.delete("メールアドレス","CSEメールアドレス");

	delete.execute();
}
```
#### 3.2.1. HTTPリクエスト
DELETE:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/identities/{CSEメールアドレス}
が実行されます。

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

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

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