SalesforceからGoogle Driveへのアップロード設定

# 前提
1. Google
1. Salesforce
1. Google Drive API

# 設定
[Google] Google Driveを有効化 ([参照](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#1-google-drive-api%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96))
[Google] Client ID, Client Secretの取得 ([参照](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#3-google-%E3%81%A7%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%9C%E6%88%90))
[Salesforce] Auth. Providersの設定 ([参照](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#4-google-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%AEauth-provider%E3%82%92%E4%BD%9C%E6%88%90))
[Google] Authorized redirect URIsの設定 ([参照](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#5callback-url%E3%82%92authorized-redirect-uris%E3%81%AB%E8%BF%BD%E5%8A%A0))
こちらは記事「Files ConnectでGoogle DriveをSalesforceに接続」を参照ください。

https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed

## 追加設定
上記設定に加えて追加設定です。
1. External Credential
1. Principal
1. Named Credential

外部サービスへのNamed Credentialsは通常のNamed Credentialsとは分かれて設定できるようになっています。2024.11以前の設定方法はまだLegacyバージョンとして利用可能ですが、そのうち設定方法も統合されるかと思います。今回はExternal Named Credentialsで設定していきます。

### External Named Credential
まずNamed CredentialsでExternal Credentailsのタブへいき、Newを押します。
![named-external-new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/4abe8441-5652-4288-521e-56c1fcdfa186.png)

Auth. ProviderはすでにGoogleDriveという名称で作成しているので再利用します。
参照 [Auth. Providersを作成](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#4-google-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%AEauth-provider%E3%82%92%E4%BD%9C%E6%88%90)
![new-external-credential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/a3053a56-80ed-2572-44f9-287b6241d172.png)


|項目|値|
|:-|:-|
|Label|GoogleDrive（任意）|
|Name|GoogleDrive（任意）|
|Authentication Protocol|OAuth 2.0|
|Authentication Flow Type|Browser Flow|
|Authentication Provider |GoogleDrive (既に作成したものを選択）|

### Principal
次は、Principalですが、同External Credentialsの画面をスクロールすると下の方にRelated Named CredentailsとPrincipalsという項目があります。
![principal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/76a1750e-2d70-5cdf-ee5b-0da3e143a768.png)

最初は何もないのでまずPrincipalsのセクションのNewでPrincipalをひとつ作成します。
![principal-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/e34e7448-db9f-5017-fcf8-7d67bcc47059.png)

|項目|値|
|:-|:-|
|Parameter Name|GoogleDriveV3（任意）|
|Sequence Number|1|
|Identity Type|Per User Principal（ユーザーが個々で承認するため）|
|Scope| `https://www.googleapis.com/auth/drive` |

### Named Credential
次はNamed Credentialsを、上記手順で作成したExternal CredentialとPrincipalを使って`２つ`作成していきます。まずNamed Credentialsで今度は`Named Credentials`のタブへいきNewをクリックします。余談ですが、プルダウンメニューは以前の設定方法のLegacyの作成ですが、今回は対象外です。
![named-credential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/045e91e2-a5f9-c288-2a61-d456a02e6ec5.png)

さて二つのNamed Credentailsを作成していきます。
1. Google Drive API
1. Google Drive APIのUpload

まずGoogle Drive APIですが、こちらはGoogle Drive APIの全体の機能を利用するScopeですが、もうひとつUpload用にNamed Credentialを作成します。

### Named Credential (全体用）
![new-named-credentials-external.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/e9da7d59-ff69-a66b-0008-72de2dde2680.png)
|項目|値|
|:-|:-|
| Label | GoogleDrive（任意） |
| Name | GoogleDrive（任意）|
| URL | `https://www.googleapis.com/drive/v3` |
| Enabled for Calouts | true |
| External Credential | GoogleDrive (上記で作成したものを選択) |

### Named Credential（Upload用）
![named-credential-upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/a60402c7-a721-ab40-6c24-827c7ad861c7.png)
|項目|値|
|:-|:-|
| Label | GoogleDriveUpload（任意） |
| Name | GoogleDriveUpload（任意）|
| URL | `https://www.googleapis.com/upload/drive/v3` |
| Enabled for Calouts | true |
| External Credential | GoogleDrive (上記で作成したものを選択) |

こちらをそれぞれ作成すると、同じExternal Credentialを利用したNamed Credentialsが作成されます。
#### Named Credentails (２つ）
![named-credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/45a8ae8d-e0d5-f821-8101-c4f4ea20ec24.png)

#### External Credential（１つ）
![external-credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/d7ac41aa-5fd1-7c36-0e96-a7f44f854c46.png)

External Credentialをクリックして再度見てみると、１つの`Auth. Provider`を利用して、２つの`Named Credentials`が紐づいているのがわかります。ただ`Principal`がまだNot Configuredなので、次はConfigurationを行って有効化します。
![GoogleDrive-credential-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/1cfacaf2-c3aa-48c1-e411-f4177d2356e3.png)

## Permission Set
Configurationをする前にユーザーに対して先ほど作成したExternal Credentialsに対するAccessを付与する必要があります。`Permission Set`にいき、`External Credentials Access`で付与します。
参照: [Permission設定の作成し割り当て](https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed#7-permission-set%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6)

![permission-set-external-credential-access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2ab234f1-3d6e-b34b-c9cd-ad1e7b04933c.png)
左から右に移動して完了です。
![permision-set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/19bb7078-1774-b624-bab9-dff9ed3a9506.png)

## Authentication
次は、PrincipalsがNot Configuredですので、こちらをConfiguredにします。Per User Principalなので、誰か一人がConfiguredにすればConfiguredになります。複数人が利用するためには、利用者個人がそれぞれ下記の認証プロセスをして、SalesforceからGoogle Driveへのアクセスを認証する必要があります。

![my-setting-external-credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/a07774a8-42f7-6c98-238a-feb3e3d05e6e.png)
1. まずPersonal Settingに行くため右上のアイコンのSettingをクリック
1. External Credentailsをクリック
1. Allow Accessで認証プロセスへ

認証プロセスが始まるとGoogleとSalesforceへと認証の画面があるので進みます。
### Googleとしてログイン認証
![verification-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/c1503876-53b6-0279-3461-865fde8e6a78.png)
### Salesforceへのログイン認証
![verification-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2b9315e9-8eab-fab9-df88-3a77e05f0ea6.png)

`Configured`になれば完了です。
![verification-configured.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/92dc45cd-076e-b2a0-e679-314fe6911394.png)

External Credentail側でもPrincipalsがConfiguredになっているのを確認します。
![principal-configured.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/6dcef7d4-bafd-76c8-fee4-1dcd730f8463.png)


## 検証
さて、上記の設定はできました。お疲れさまです。
これからLWCでファイルアップロードのコンポーネントを作成していくのですが、ApexでいくつかのCalloutメソッドを作成していきます。その前に、Anonymous WindowでCalloutが無事通るか検証してみます。
### Apex Anonymous Windowで検証 (Folder作成）
ApexでNamed Credentialを利用してGoogleDriveにFolderを作成できるか試します。今回はNamed Credentailsの`GoogleDrive`を使用してフォルダを作成します。
Developer Consoleを開き、`Debug` > `Open Execute Anonymous Window`で以下のコードを実行します。
<details><summary>Apex Code</summary>

```apex
String folderName = 'FirstFolder';
String parentFolderId = 'root';
Map<String, Object> requestBody = new Map<String, Object>{
    'name' => folderName,
        'mimeType' => 'application/vnd.google-apps.folder',
        'parents' => new List<String>{ parentFolderId }
};
    
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:GoogleDrive/files');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setBody(JSON.serialize(requestBody));

Http http = new Http();
HttpResponse res = http.send(req);
```
</details>

#### 実行画面
![Debug-Execute.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/b2f02fa2-959d-4b3a-7c3f-5041b5d71478.png)

すると、GoogleDrive側で、rootの下に`FirstFolder`というフォルダが作成できていれば、Named CredentialをCalloutしてFolder作成の成功です。
![root-firstFolder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/c3553a68-8a40-2179-7059-2908edbd23ac.png)

実際作成されたFolderIdのURLをみていただくと、こちらをフォルダ名で取得してparentFolderIdに当てれば、このフォルダ配下にファイルをアップロードしていくこともできます。
![google-drive-folderId.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/9e537ebe-0d47-1d14-eab6-5cb1933c6fb0.png)


## まとめ
認証の設定は思ったより長いので大変ですね。記事もわけないと書ききれないので、設定だけで一旦この記事は終えます。次の記事では実際のApexとLWCの作成を行います。


## 参照：
https://developers.google.com/drive/api/guides/folder

https://trailhead.salesforce.com/ja/content/learn/modules/apex_integration_services/apex_integration_rest_callouts

## 関連記事
https://qiita.com/masahiro_sf/items/d4cc1bfe3ffe6f75f0ed