API

外部システムからSalesforce REST APIへ接続する手順

外部クライアントアプリを準備し、パスワードを使わないフローで認証してSalesforce REST APIを呼び出すまでの手順を説明します。

2023.02.10

なぜ認証の設計が要るのか

外部システムからSalesforceのREST APIを呼ぶときも、必ず誰かとしてログインした状態が要ります。データを扱うエンドポイントは、匿名では叩けません。呼び出す側のユーザにAPIへのアクセス権があるか、そのユーザのプロファイルで「API の有効化」が許可されているかを、まず確認します。

接続アプリケーションは新規作成できない

Spring '26以降、Salesforceは新規の接続アプリケーション(Connected App)の作成を既定で止めています。API・画面のどちらから作成しようとしても、パッケージのインストールで作られる場合を除いてブロックされます。既存の接続アプリケーションはそのまま動きますが、これから外部システムを繋ぐなら、次世代版の外部クライアントアプリ(External Client App)を使います。

外部クライアントアプリは、開発者側の設定と管理者側のポリシーを分けて管理できるなど、接続アプリケーションの弱点を補う位置づけです。ユーザプロビジョニングが必要な連携だけは、まだ接続アプリケーションのみが対応しています。

外部クライアントアプリを作る

  1. App Managerを開く

    「設定」の検索欄で「App Manager」を開きます。

  2. 新規外部クライアントアプリを選ぶ

    一覧右上の「新規外部クライアントアプリ」から、アプリ名・API参照名・連絡先メール(xxxxxxxx@example.com)を入力します。

  3. OAuth設定を有効化する

    「OAuth設定を有効化」をオンにし、コールバックURLと、必要なOAuth範囲だけを選びます。範囲は広く取らず、実際に使う分だけにします。

  4. 保存してコンシューマの詳細を確認する

    保存後、アプリの操作メニューから「表示」を開き、「コンシューマの詳細を管理」でコンシューマ鍵とコンシューマの秘密を確認します。本人確認を求められ、表示できる時間も限られています。控えたら、安全な場所に保管します。

接続に使うユーザの権限を絞る

接続用のユーザには、システム管理者のプロファイルを使いません。最小権限のプロファイルにユーザを所属させ、必要なオブジェクト・項目へのアクセスだけを権限セットで足します。プロファイルで「API の有効化」が許可されていることも確認します。この連携が何にアクセスできるかを、権限セット1つで説明できる状態が目安です。

プロファイルのシステム管理者権限一覧。「API の有効化」に赤枠とチェックが付いている
接続に使うユーザのプロファイル設定です。「API の有効化」にチェックが入っているかを確認します。

フローを選ぶ

フロー向いている場面特徴
クライアントクレデンシャルサーバー間の定期連携、ユーザの操作を挟まないコンシューマ鍵とコンシューマの秘密だけで認証。指定した統合ユーザとして実行される
JWTベアラーサーバー間の自動連携、証明書を管理できるデジタル証明書で署名したJWTを送る。パスワードを一切使わない
認可コード(PKCE付き)ユーザ自身が同意してログインするWebアプリブラウザ経由でユーザがログインし、同意した範囲だけにアクセスする

⚠️ ユーザ名パスワードフローは使いません。Summer '23以降に作成された組織では既定でブロックされています。ユーザ名とパスワードをそのまま送る形なので、Salesforceも上の3つのフローへの切り替えを勧めています。

クライアントクレデンシャルフローで接続する

ユーザの操作を挟まない定期連携なら、クライアントクレデンシャルフローが単純です。外部クライアントアプリでこのフローを構成し、実行ユーザに接続用ユーザを指定してから、トークンエンドポイントへ次のリクエストを送ります。

curl -X POST "https://xxxx.my.salesforce.com/services/oauth2/token" \
  -d "grant_type=client_credentials" \
  -d "client_id=xxxxxxxx" \
  -d "client_secret=xxxxxxxx"

コンシューマ鍵とコンシューマの秘密だけでアクセストークンを取得します。パスワードは送りません。

レスポンスの access_token を、以降のAPI呼び出しの Authorization: Bearer に使います。

トークン取得のレスポンスJSON。access_token・instance_url・token_typeなどの値は黒く塗られている
トークン取得のレスポンスです。この access_token を次の呼び出しで使います。

アクセストークンでオブジェクトの情報を取得する

curl "https://xxxx.my.salesforce.com/services/data/v67.0/sobjects/Account/describe" \
  -H "Authorization: Bearer xxxxxxxx"

取引先のメタ情報を取得します。バージョンは数値のほか latest も指定できます。

バージョンを付けない /services/data/ へのGETは認証なしで叩け、利用できるバージョン一覧がそのまま返ります。接続先の組織がどのバージョンまで対応しているかを、ここで確かめられます。

APIクライアントのGET欄。describeのエンドポイントURLが入力されている
オブジェクト情報を取得するリクエストです。メソッドはGET、宛先は describe のエンドポイントです。
APIクライアントのToken入力欄。値は黒く塗られている
認証情報の指定です。Bearer Token として、先ほどの access_token をここに入れます。
当時の手順書。レコード取得リクエストのメソッド・エンドポイント・Authorization設定が並んでいる
当時の手順書です。メソッド、エンドポイント、Authorizationの3つをどう指定したかがまとまっています。
ステータス200 OKと、取引先のdescribe結果のJSON。childRelationshipsなどが並ぶ
取得できたレスポンスです。200 OK が返り、取引先のメタ情報がJSONで戻ってきます。
当時の手順書。レコード取得レスポンスの200 OKとJSON本文が貼られている
当時の手順書のレスポンス側です。どこまでが1件分の情報かを、この形で確認していました。

ここで間違えやすい

間違い何が起きるか
接続アプリケーションを新規作成しようとするSpring '26以降は既定でブロックされます。外部クライアントアプリを使います
ユーザ名パスワードフローで組もうとする新しい組織では既定でブロックされ、認証が通りません
接続用ユーザにシステム管理者権限を与える侵害時の影響が広がります。権限セットで必要な分だけ足します
OAuth範囲を全部選んでおく実際に使わない範囲まで許可され、監査時に説明できません

確認した環境

  • 2026年9月/Salesforce Summer '26(APIバージョン67.0)時点の公式ドキュメントで、接続アプリケーションの制限とOAuthフローを確認しています

まとめ

  • 新規の接続アプリケーションはSpring '26以降作成できません。外部クライアントアプリを使います
  • ユーザ名パスワードフローは既定でブロックされています。クライアントクレデンシャル・JWTベアラー・認可コード(PKCE付き)のいずれかを選びます
  • 接続用ユーザは最小権限のプロファイルにし、権限セットで必要な範囲だけ足します
  • コンシューマ鍵とコンシューマの秘密は、本人確認のうえ限られた時間だけ表示されます

参考:当時の画面

記事を最初に書いた当時の画面です。いまの手順と違うところは、各画像の説明に書いています。

設定画面の接続アプリケーション一覧。上部に「新規」ボタンが並ぶ
接続アプリケーションの一覧画面です。当時はここの「新規」から作成していました。
新規接続アプリケーションの確認画面。反映に最大10分かかる旨の赤い注意文が出ている
保存直後の確認画面です。設定が効くまで最大10分かかる、という注意が出ます。
接続アプリケーションの入力画面。OAuth設定の有効化にチェックを入れ、コールバックURLとOAuth範囲を指定している
OAuthの設定画面です。コールバックURLと、右側の「選択したOAuth範囲」に何を入れたかを見てください。
作成した接続アプリケーションの詳細画面。コンシューマ鍵とコンシューマの秘密は黒く塗られている
保存後の詳細画面です。コンシューマ鍵と秘密は、この画面で控えて安全な場所に保管します。
APIクライアントのPOST画面。grant_typeにpassword、username・passwordを並べたパラメータ表
当時のトークン取得リクエストです。grant_type が password になっている点に注目してください。

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。