概要とビジネスシーン
Connected Apps(接続アプリケーション)は、Salesforceと外部アプリケーション間の安全な認証と連携を可能にするSalesforceプラットフォームの強力な機能です。OAuth 2.0やOpenID Connectなどの業界標準プロトコルを利用して、ユーザーの同意に基づき、外部サービスがSalesforceのデータや機能にアクセスするためのゲートウェイを提供します。
実際のビジネスシーン
Connected Apps は、今日の複雑なエンタープライズ環境において、様々なシステム間のシームレスなデータ連携を実現し、ビジネスプロセスを効率化します。
シーンA - 小売・eコマース業界:
- ビジネス課題:ある大規模なECサイトでは、顧客がオンラインで注文した後にSalesforce上の顧客情報や注文履歴がリアルタイムに更新されず、顧客サービス担当者が最新の情報を把握できないという課題がありました。これにより、顧客からの問い合わせ対応が遅延し、顧客満足度が低下していました。
- ソリューション:ECサイトプラットフォームとSalesforceの間にConnected Appを構築しました。これにより、ECサイトからSalesforceへのセキュアなAPIアクセスが可能となり、新規注文や顧客情報の更新が即座にSalesforceに同期されます。
- 定量的効果:顧客サービス担当者が常に最新の顧客情報にアクセスできるようになり、平均応答時間が25%短縮されました。また、顧客満足度スコアが15%向上しました。
シーンB - 製造業・ERP連携:
- ビジネス課題:製造業の企業が基幹系システム(ERP)とSalesforceの間で製品マスターデータや在庫情報を手動で同期しており、データ入力ミスや情報鮮度の低下が頻繁に発生していました。これにより、営業担当者が顧客に提示する製品情報が古く、誤った納期を伝えてしまうリスクがありました。
- ソリューション:ERPシステムを外部アプリケーションとしてConnected Appを介してSalesforceと連携させました。ERPからSalesforceへの定期的なデータ同期バッチを開発し、Salesforce上の製品カタログや在庫情報が常に最新に保たれるようにしました。
- 定量的効果:手動によるデータ入力作業が80%削減され、データ整合性が99.5%に向上しました。これにより、営業担当者の信頼性が向上し、誤った納期伝達による機会損失が年間数百万ドル減少しました。
シーンC - テクノロジー・モバイルアプリ:
- ビジネス課題:自社開発の営業支援モバイルアプリケーションが、Salesforce上の顧客情報や商談データに直接アクセスできず、営業担当者は外出先で重要な情報を参照するためにSalesforceのモバイルアプリを別途開く必要がありました。これは非効率的であり、生産性を低下させていました。
- ソリューション:モバイルアプリケーションをConnected AppとしてSalesforceに登録し、OAuth 2.0認証フローを通じてモバイルアプリから直接SalesforceのAPIにアクセスできるようにしました。これにより、営業担当者は一つのアプリで必要な全ての情報にアクセスできるようになりました。
- 定量的効果:営業担当者のモバイルアプリ利用率が40%向上し、日々の営業活動における情報検索時間が平均15分短縮されました。その結果、商談の成約率が5%向上しました。
技術原理とアーキテクチャ
Connected Apps は、OAuth 2.0(Open Authorization)などの認証プロトコルを基盤としています。基本的な動作メカニズムは、外部アプリケーション(クライアント)がSalesforce(リソースサーバー)のリソースにアクセスするために、ユーザーからの許可を得てアクセストークンを取得する流れです。
主要コンポーネント
- コンシューマーキー(Consumer Key / Client ID):Connected Appを一意に識別するための公開鍵。
- コンシューマーシークレット(Consumer Secret / Client Secret):Connected Appの秘密鍵。外部アプリケーションがアクセストークンを要求する際に、その正当性を証明するために使用されます。厳重な管理が必要です。
- コールバックURL(Callback URL / Redirect URI):認証プロセスが完了した後、Salesforceがユーザーエージェント(通常はブラウザ)をリダイレクトするURLです。ここに認可コード(Authorization Code)が渡されます。
- OAuthポリシー(OAuth Policies):許可されるユーザー、IPアドレスの範囲、リフレッシュトークンの有効期間など、Connected Appの認証に関するセキュリティポリシーを定義します。
- プロファイルと権限セット(Profiles and Permission Sets):Connected Appへのアクセスを許可するユーザーのグループを制御します。これにより、誰がどのアプリケーションを使ってSalesforceにアクセスできるかを細かく管理できます。
- スコープ(Scopes):外部アプリケーションがアクセスできるSalesforceデータの種類や操作(例: API、Full、Refresh Tokenなど)を定義します。最小限の権限(Principle of Least Privilege)を付与することがベストプラクティスです。
データフロー(Web Server Authentication Flowの例)
Connected Appsを介したOAuth 2.0 Web Server Authentication Flowの一般的なデータフローを以下に示します。
| ステップ | 説明 | 主体 |
|---|---|---|
| 1. 認証リクエスト | 外部アプリケーションが、ユーザーをSalesforceの認可エンドポイントにリダイレクトし、response_type=code, client_id, redirect_uri, scope などを指定します。 |
外部アプリ → Salesforce |
| 2. ユーザー認証と同意 | Salesforceはユーザーにログインを求め、指定されたスコープに基づき外部アプリケーションへのアクセスを許可するか尋ねます。 | Salesforce ←→ ユーザー |
| 3. 認可コード付与 | ユーザーがアクセスを許可すると、Salesforceはauthorization_codeをredirect_uriにリダイレクトします。 |
Salesforce → 外部アプリ |
| 4. アクセストークン要求 | 外部アプリケーションは、取得したauthorization_codeと自身のclient_id, client_secret, redirect_uriをSalesforceのトークンエンドポイントにPOSTリクエストで送信します。 |
外部アプリ → Salesforce |
| 5. アクセストークン付与 | Salesforceはリクエストを検証し、access_token、refresh_token(リクエストされた場合)、instance_url などを返します。 |
Salesforce → 外部アプリ |
| 6. APIリクエスト | 外部アプリケーションは、取得したaccess_tokenを使用して、SalesforceのAPIエンドポイントに保護されたリソースを要求します。 |
外部アプリ → Salesforce |
| 7. リソース応答 | Salesforceはリクエストを処理し、指定されたデータを外部アプリケーションに返します。 | Salesforce → 外部アプリ |
ソリューション比較と選定
Salesforceにおける外部システム連携には様々な方法がありますが、Connected AppsはOAuth 2.0ベースの認証・認可を必要とするシナリオで特に強みを発揮します。
| ソリューション | 適用シーン | パフォーマンス | Governor Limits | 複雑度 |
|---|---|---|---|---|
| Connected Apps | 外部Web/モバイルアプリ、SaaS連携、サービス間連携。OAuth 2.0標準に基づくセキュアな認証が求められる場合。 | 認証フローは数回のHTTPリクエストを伴うため、初期接続にはオーバーヘッドがあるが、トークン利用後はAPI呼び出しのパフォーマンスは高い。 | 直接的な制限はないが、取得したトークンで行うAPI呼び出しはSalesforceのAPI呼び出し制限(後述)に従う。 | OAuthフローの理解と実装が必要。設定はSalesforce UIで比較的容易だが、クライアント側の実装は連携方式に依存。 |
| Named Credentials | Salesforceから外部システムへのコールアウト。認証情報をコードに埋め込まず、Salesforceが認証を処理する場合。 | Salesforceが認証を自動処理するため、Apexコールアウトのコードはシンプルになり、効率的。 | Salesforceから外部へのコールアウト回数制限(例: 1日あたり最大 100,000 回のコールアウト)に従う。 | 設定はSalesforce UIで比較的容易。Apexコードからの利用はシンプル。Connected Appsを内部的に利用することもある。 |
| API Key (一般的な外部サービス) | 外部システムが単純なAPI KeyやBasic認証でアクセスを提供している場合。主に外部からSalesforceではないサービスを呼び出す場合。 | 通常、認証ステップが少ないため高速。 | SalesforceのGovernor Limitsとは直接関係ないが、呼び出し先のAPI制限に従う。 | 最もシンプルだが、API Keyの管理やセキュリティリスクが高い。Salesforce連携では非推奨。 |
Connected Apps を使用すべき場合
- ✅ **外部アプリケーション(モバイルアプリ、Webサイト、SaaS連携など)がSalesforceのデータや機能に安全にアクセスする必要がある場合。**
- ✅ **OAuth 2.0などの業界標準プロトコルに基づいた、セキュアで柔軟な認証・認可メカニズムが必要な場合。**
- ✅ **ユーザーの同意に基づいて、外部アプリケーションが特定のSalesforceリソースにアクセスすることを制御したい場合。**
- ✅ **Salesforceのデータを外部データソースとして、または外部データソースからSalesforceを更新するような双方向連携を構築する場合。**
- ❌ **Salesforce内部から外部サービスへ安全にコールアウトしたいが、認証情報の管理をSalesforceに任せたい場合(Named Credentialsの方が適しています)。**
- ❌ **シンプルでセキュリティ要件の低いデータ転送(ただし、通常はConnected Appsを用いるべき)の場合。**
実装例
Connected App の作成は Salesforce の UI から行いますが、ここでは外部アプリケーションが Salesforce API にアクセスするための OAuth 2.0 Web Server Flow のアクセストークン取得部分を curl コマンドで示します。
前提:
- Salesforce組織にConnected Appが作成済みであること。
Consumer Key(クライアントID) とConsumer Secret(クライアントシークレット) が発行されていること。Callback URL(リダイレクトURI) が設定されていること。- Connected Appに割り当てられたプロファイルまたは権限セットを持つユーザーがログイン済みであること。
# 1. 認可コード (Authorization Code) の取得リクエスト例 # このURLにブラウザでアクセスすると、Salesforceのログイン画面とアクセス許可画面が表示されます。 # ユーザーが許可すると、設定されたCallback URLに認可コードを含む形でリダイレクトされます。 # # GET https://login.salesforce.com/services/oauth2/authorize # ?response_type=code # &client_id=YOUR_CONSUMER_KEY_HERE # &redirect_uri=YOUR_CALLBACK_URL_HERE # &scope=id%20api%20web%20full%20refresh_token # 上記リクエストの結果、Callback URLに以下のような形でリダイレクトされます(YOUR_AUTHORIZATION_CODE_HEREは取得された実際のコード)。 # YOUR_CALLBACK_URL_HERE?code=YOUR_AUTHORIZATION_CODE_HERE # 2. 認可コードを使用してアクセストークン (Access Token) を取得するリクエスト例 # このリクエストは、通常、外部アプリケーションのバックエンドから実行されます。 # 取得した認可コードと、Connected Appのコンシューマーシークレットを使用します。 curl -X POST \ https://login.salesforce.com/services/oauth2/token \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code&code=YOUR_AUTHORIZATION_CODE_HERE&client_id=YOUR_CONSUMER_KEY_HERE&client_secret=YOUR_CONSUMER_SECRET_HERE&redirect_uri=YOUR_CALLBACK_URL_HERE'
実装ロジック解析:
GET /services/oauth2/authorize:このエンドポイントは、Salesforceの認証・認可画面をユーザーに提示します。client_id(Connected Appのコンシューマーキー)、redirect_uri(コールバックURL)、scope(要求するアクセス権限)などのパラメータを指定します。ユーザーが認証に成功し、アクセスを許可すると、Salesforceは指定されたredirect_uriに認可コードを付与してリダイレクトします。POST /services/oauth2/token:このエンドポイントは、取得したauthorization_codeを実際のアクセストークンと交換するために使用されます。このリクエストはサーバーサイドで実行されるべきであり、client_secret(コンシューマーシークレット)が含まれるため、クライアントサイドからは直接呼び出さないのが一般的です。grant_type=authorization_codeを指定し、code、client_id、client_secret、redirect_uriをパラメータとして送信します。Salesforceはこれらの情報を検証し、有効であればaccess_token、refresh_token、instance_urlなどの情報を含むJSONレスポンスを返します。
このアクセストークンを使用して、外部アプリケーションは Salesforce の REST API エンドポイント (instance_url で指定される URL) に HTTP リクエストを行い、Salesforce のデータにアクセスできるようになります。
注意事項とベストプラクティス
権限要件
- Connected Appアクセス権限:Connected Appを作成後、「プロファイル」または「権限セット」を通じて、アクセスを許可するユーザーに明示的にConnected Appへのアクセス権限を付与する必要があります。
- API有効化:APIを利用するユーザーのプロファイルには、「API 有効」権限が付与されている必要があります。
- スコープの最小化:Connected Appで要求するOAuthスコープは、必要最小限に留めるべきです。例えば、データの読み取りのみが必要であれば
apiスコープで十分であり、fullスコープは避けるべきです。
Governor Limits
Connected Apps自体に直接的なGovernor Limitsはありませんが、Connected Appsを通じて実行されるAPI呼び出しには以下のSalesforce組織の制限が適用されます。
- API呼び出しの制限:各Salesforce組織には、24時間あたりのAPI呼び出し回数に制限があります。これは、組織のエディションやライセンスの種類によって異なりますが、例えばEnterprise Editionでは、ライセンス数に応じて上限が設定されています(例: ユーザーライセンスあたり1,000回/日 + ベースライン)。
- 非同期呼び出しの制限:
Queueable ApexやFuture Methodなど、非同期処理を伴うAPI呼び出しは、1日あたり最大 250,000 回(または組織のAPI制限の200倍のいずれか高い方、最大100万回)の非同期 Apex メソッド実行制限に含まれます。
エラー処理
- OAuthエラーコード:OAuthフロー中に発生する一般的なエラーには、
invalid_grant(認可コードの無効化、期限切れ、既に使用済みなど)、unauthorized_client(クライアントIDまたはシークレットの誤り、Connected Appの無効化)、invalid_scope(要求されたスコープが無効)などがあります。これらのエラーコードを適切にハンドリングし、ユーザーまたは管理者に分かりやすいメッセージを返す必要があります。 - リフレッシュトークンの管理:アクセストークンは短期間で期限切れになりますが、リフレッシュトークンを使用して新しいアクセストークンを取得できます。リフレッシュトークンも失効する可能性があるため(手動失効、Connected Appのポリシー、長期間未使用など)、その場合の再認証フローを考慮したエラー処理が必要です。
パフォーマンス最適化
- リフレッシュトークンの適切な利用:頻繁にアクセストークンを再取得するのを避け、一度取得したリフレッシュトークンを使って必要に応じて新しいアクセストークンを取得することで、認証フローのオーバーヘッドを削減します。
- Composite APIの活用:複数の関連するAPI呼び出しを単一のリクエストにまとめることができるComposite API(複合API)を活用することで、ネットワークラウンドトリップ数を減らし、全体的なパフォーマンスを向上させます。
- キャッシュの利用:頻繁に参照されるが更新頻度が低いSalesforceデータは、外部アプリケーション側でキャッシュすることで、API呼び出し回数を減らし、応答速度を向上させます。ただし、データの鮮度に関する要件を考慮する必要があります。
よくある質問 FAQ
Q1:Connected Appのコンシューマーキーとシークレットが漏洩した場合どうすべきか?
A1:直ちにSalesforceの設定画面からConnected Appのコンシューマーキーとシークレットをリセットしてください。同時に、そのConnected Appに関連付けられたすべてのアクセストークンとリフレッシュトークンを失効させ、外部アプリケーション側でも新しい鍵情報に更新し、再認証プロセスを踏む必要があります。
Q2:Connected App が正常に動作しない場合のデバッグ方法は?
A2:
- Connected Appの設定確認:コンシューマーキー/シークレット、コールバックURLが正確か、IP範囲制限がないか、許可されるユーザーポリシーを確認します。
- プロファイル/権限セットの確認:Connected Appへのアクセスが許可されているか確認します。
- Salesforce監査ログ(Setup Audit Trail):Connected Appの作成や変更、セキュリティポリシーの変更履歴を確認できます。
- Salesforceイベントモニタリング:OAuth認証イベントログを分析することで、認証フロー中の詳細なエラー情報や成功状況を把握できます(ただし、通常は有料ライセンスが必要)。
- 外部アプリケーション側のログ:外部アプリケーションがSalesforceへのリクエスト時にどのようなレスポンスを受け取っているか、詳細なログを確認します。特にHTTPステータスコードやエラーメッセージに注目してください。
Q3:アクセストークンとリフレッシュトークンの有効期限はどのように管理すべきですか?
A3: アクセストークンは通常、数時間(デフォルト2時間)で期限切れになります。リフレッシュトークンはConnected Appのポリシー設定に応じて無期限にすることも可能ですが、セキュリティ上の理由から明示的な有効期限を設定したり、定期的な失効と再取得を検討したりすることが推奨されます。外部アプリケーションは、アクセストークンの期限切れを検知したら、リフレッシュトークンを使って新しいアクセストークンを取得するロジックを実装する必要があります。リフレッシュトークンも失効した場合は、ユーザーに再ログインを促す必要があります。
まとめと参考資料
Connected Apps は、Salesforce と外部システム間のセキュアな連携を実現するための不可欠なツールです。OAuth 2.0 に基づく堅牢な認証メカニズム、柔軟なアクセス制御、そして多様なビジネスシナリオへの適用可能性は、Salesforce インテグレーションエンジニアがマスターすべき核心的な知識です。適切な設定とベストプラクティスに従うことで、安全性と効率性を両立したインテグレーションソリューションを構築できます。
重要ポイントの要約:
- Connected Apps は Salesforce と外部アプリケーション間の安全な認証・認可のゲートウェイ。
- OAuth 2.0 に基づき、ユーザーの同意を得てアクセストークンを発行。
- コンシューマーキー/シークレット、コールバックURL、スコープ、OAuthポリシーなどのコンポーネントが重要。
- セキュリティと最小権限の原則に基づき、スコープやアクセス権限を厳格に管理する。
- API呼び出しのガバナー制限、エラー処理、トークンの管理がインテグレーションの成功に不可欠。
公式リソース:
- 📖 公式ドキュメント:Connected Apps Overview
https://developer.salesforce.com/docs/atlas.en-us.connected_app_dev.meta/connected_app_dev/connected_app_overview.htm - 📖 公式ドキュメント:OAuth 2.0 Web Server Authentication Flow
https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/sforce_rest_oauth_web_server_flow.htm - 🎓 Trailhead モジュール:Connected Apps の管理(Manage Connected Apps)
https://trailhead.salesforce.com/content/learn/modules/identity_and_access_management/manage_connected_apps - 🔧 関連 GitHub サンプル:Salesforce identity samples (JWT Bearer Flowなど)
https://github.com/forcedotcom/Salesforce-Identity-Samples
コメント
コメントを投稿