Salesforce FlowからSalesforce APIをCallするまでの手順

# はじめに
- Winter'24からフローからAPIコールアウトができるようになった
- 相当複雑でなければApexをいちいち書かなくて良くなった
- コールアウトやってみた系の記事は多いのだが、外部サービスへのコールアウトが多く、Salesforce APIを組織からコールアウトするHow toが少なかったため作成

# 1. 接続アプリを作成する
- API Call時の認証アプリを作る
- Salesforce APIは認証が必須のため
- 例はOAuth設定を有効化し、選択したOAuth範囲を `いつでも要求を実行` と `フルアクセス`としている
- コールバックURLは作成時はなんでもよい（あとで変更する）
- 作成後、コンシューマーキーと秘密を取得（コピー）しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/20871c5d-2e39-6191-3f46-a2434ce6f8ab.png)

# 2. 認証プロバイダの作成
- 接続アプリで使用する認証プロパイダーの作成
- 接続アプリで指定したコンシューマーキーと秘密、OAuthの範囲を指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/4c48cbed-8526-edd6-8d93-016252b9ed21.png)
- 作成したら、下記の[Salesforce 設定]のコールバックURLを1.接続アプリのコールバックURLに設定しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/7e5f51c8-2d4c-e5b7-03fe-874faf38b940.png)


# 3. 外部ログイン作成
- 設定 > 指定ログイン情報のタブから外部ログイン情報を先に作成する
- 認証プロバイダーは2.で作成したものを使用（そして認証プロトコルはOAuth 2.0）  


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/96599f89-421a-78a7-4fc7-081aa780c0ba.png)

## 3-1. プリンシパルを作成
- ID種別: 指定ユーザとして作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/0a7bbd91-69b7-663e-35c1-ec233fe469bd.png)
- 設定された認証プロバイダーを使って[認証]を行う
- 正しく設定されていれば、認証状況が認証済みになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/56d4b7a2-33d0-8580-3884-f496bc8924e3.png)
 

# 4. 指定ログイン作成
- フローでのコールアウトで使用するURIと3.で作成した外部ログイン情報を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/47150933-8202-0a8f-80ab-83518343bc06.png)

## Connect REST APIのInstace名について
- 今回、例としてScheduling APIを設定した。例えば[こちら](https://developer.salesforce.com/docs/atlas.ja-jp.chatterapi.meta/chatterapi/connect_resources_scheduling_waitlist_checkin.htm)のAPIになるのだが、リソースが`https://yourInstance.salesforce.com/services/data/v59.0/connect/scheduling/waitlist-checkin`という風になっており、この`yourInstance`が何なのかハマってしまった。
- 単純に設定 > 私のドメイン > **現在の [私のドメイン] の URL** でよかったオチである
- 下記のような方法もあるらしく、参考にどうぞ

```txt:curl
curl -X POST 'https://yourInstance.my.salesforce.com/services/oauth2/token' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'grant_type=client_credentials' \--data-urlencode 'client_id=3MVG9wt4IL4O5wvIwuDUz4YUlU.pQ2qL9PA5YrVvkAxtBkMRcDwEDN9inEg3ujTTrZRbl2KnRD7F8iFxxxxx' \--data-urlencode 'client_secret=B5E4AA8F293C052D96C9010866AAXXXXXX6E4A16CA5250806BE943A5F1E7360'
```
```txt:return. IDは適当にしてある
{"access_token":"00D5i000002OxQr!ARQAQF3EywD2Pzde2D7_ie.vZTZY3sG95ExZ6z.Gn8hFR3o.DiWgOBdGhKJWGEAT7IMBCk1zslR.9Pqboxaz_rBgFzDbpA1B","signature":"QrLexiLQ8PN0ncptHASq/iMwhSydslmbimq7A1YV5R8=","instance_url":"https://yourInstance.my.salesforce.com","id":"https://login.salesforce.com/id/00DXXXXXXXXXX/005XXXXXXXXXXXXXXX","token_type":"Bearer","issued_at":"1705988512338"}%   
```
- この `instance_url`が間違いなく`yourInstance`の値となります
- ずっと `my.`をつけ忘れていて数時間彷徨った

### `{"error":"invalid_grant","error_description":"no client credentials user enabled"}`が発生したとき
- クライアントログインフローの実行ユーザが設定されていない.  
- [help](https://help.salesforce.com/s/articleView?id=sf.connected_app_client_credentials_setup.htm&type=5)を参照して接続アプリケーションの実行ユーザを指定する
- 接続アプリケーション内の[ポリシーを編集]を押さないとこの設定箇所は見えないので注意.  

# 5. あとはフローをゴニョゴニョ作成
- フロー設定についてはそこまで迷うことないので割愛します
- [Salesforce APIのResponse Code一覧](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/errorcodes.htm)で処理を分けるのは必要

# 6. フローを使用するユーザに対しての権限セットを作成して割り当てする
## 6.1. プリンシパル設定
- 3-1.で作ったプリンシパルを、[外部ログイン情報プリンシパルアクセス]に追加しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/7fc5faab-95a1-5dd4-a9dc-dd550f74e37c.png)

## 6.2. オブジェクト設定
- [ユーザの外部ログイン情報]の参照権限を付与する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/a6cbbd45-edaa-b1c5-6042-9d56db219819.png)

## 6.3. APIアクセス権限の付与
- システム権限の[APIの有効化]をONにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/70f919af-457f-69dc-b367-d2253e04e06d.png)

# 7. おまけ: Postmanの設定
- Salesforce APIを試したい時は、まずPostmanの設定から入る方も多いのではないでしょうか。しかし、そこまでAPIAPIしていない生活だと、Postman開くたびに環境が変わると設定を忘れるので、メモしておきます
## 7-1. 接続アプリを作成する
- これは上記1.の接続アプリを同じ手順

## 7-2. Salesforce APIをForkするか、ForkしたCollectionsを選択
- [ForkするURLなどはこちら](https://github.com/forcedotcom/postman-salesforce-apis/blob/master/install-with-app.md)
- [Authorization]タブを選択し、Type: `OAuth 2.0`を選択
- Callback URLはブラウザで認証にしておけばSalesforceのWebログイン画面で認証
- `{{url}}`は`https://login.salesforce.com`
- `{{clientid}}`は接続アプリケーションのコンシューマーキー
    - 上記は[Variables]に設定されている
- Scopeは`api`とする
- [Get New Access Token]ボタンをクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/38516480-be13-14f1-dbc8-5fa83bdad1c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/d15e5411-4dba-f28e-de62-6985a1250716.png)
- 認証に成功すると、Access Tokenが保存されるため、任意の名前をつけて保存

## 7-3. 対象のAPIのURIなどを設定、開く
- [Authorization]タブのTokenにて、先ほど作成したTokenを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/161f60d9-17ef-efa5-5ae9-a1e066b5559a.png)

- Bodyにパラメータを詰めて[Send]でいけるはず

# 参考情報
- とても助かりました


https://qiita.com/piepie1231/items/a7708a99805b895d5f08#the-callout-couldnt-access-the-endpoint-you-might-not-have-the-required-permissions-or-the-named-credential-piepie-might-not-exist


https://qiita.com/DEKA_PIYO/items/4984bab7d0e3dbd8c25a