セキュリティと認証について
学習の目的
この単元を完了すると、次のことができるようになります。
- Salesforce アプリケーションで使用するセキュリティおよび認証方法を理解する。
- 接続アプリケーションの使用してモバイルアプリケーションを Salesforce サーバーに統合する方法を理解する。
- OAuth の基本的な用語を理解する。
- OAuth 認証および PIN セキュリティにおけるイベントのフローを理解する。
セキュリティと認証について
モバイルデバイスで実行されているエンタープライズアプリケーションにとって、安全な認証は不可欠です。OAuth 2.0 は、ユーザーのデータへのアクセスに対する安全な認証を可能にする業界標準のプロトコルで、ユーザー名およびパスワードを渡す必要がありません。OAuth は、ソフトウェアアクセスのバレットキーと呼ばれることがよくあります。バレットキーを使用すると、自動車の特定の部分へのアクセスを制限できます。たとえば、駐車場係にバレットキーを預けても、トランクやダッシュボードの小物入れなどが開けられることはありません。
モバイルアプリケーションの開発者は、Salesforce OAuth2.0 の実装をすばやく簡単に組み込むことができます。実装では HTML ビューを使用してユーザー名とパスワードが収集され、それがサーバーに送信されます。サーバーからセッショントークンと永続更新トークンが返され、今後のやり取りのためにデバイスに保存されます。
Salesforce 接続アプリケーションは、モバイルアプリケーションを Salesforce に接続するための主要な手段です。接続アプリケーションにより、開発者とシステム管理者は、アプリケーションの接続方法およびアクセス権を付与するユーザーを制御できます。たとえば、接続アプリケーションでアクセスを一連のユーザーに制限したり、IP 範囲の設定または緩和などを行うことができます。
OAuth の用語
Oauth に関してわからないことがあれば、以下のリストが役立ちます。これらの用語をすべて把握すれば、OAuth を十分に理解できたといえます。
コンシューマー鍵 |
コンシューマー (この場合は、Mobile SDK アプリケーション) が Salesforce に自身の身分を証明するために使用する値です。 |
---|---|
アクセストークン |
ユーザーの Salesforce ログイン情報を使用する代わりに、保護されたリソースへのユーザーのアクセスを許可するためにコンシューマーにより使用される値。アクセストークンはセッション ID であり、直接使用できます。 |
更新トークン |
新しいアクセストークンを取得するためにコンシューマーが使用するトークン。エンドユーザーがアクセスを再度承認する必要がありません。 |
認証コード |
エンドユーザーによって付与されるアクセスを表示する、有効期間の短いトークン。認証コードは、アクセストークンと更新トークンを取得するために使用されます。 |
接続アプリケーション |
OAuth プロトコルを使用して Salesforce ユーザーと外部アプリケーションの両方を検証する、Salesforce の外部アプリケーション。 |
OAuth2 認証フロー
OAuth 認証時のイベントのフローは、デバイスの認証状態によって異なります。
初回の認証フロー
- 顧客が Mobile SDK アプリケーションを開きます。
- 認証プロンプトが表示されます。
- 顧客がユーザー名とパスワードを入力します。
- アプリケーションが顧客のログイン情報を Salesforce に送信し、それと引き換えに認証成功の確認としてセッション ID を受信します。
- 顧客が、アプリケーションの要求を承認してアプリケーションにアクセス権を付与します。
- アプリケーションが起動します。
継続的な認証
- 顧客がモバイルアプリケーションを開きます。
- セッション ID が有効な場合は、アプリケーションが直ちに起動します。セッション ID が期限切れの場合は、初期認証から取得された更新トークンをアプリケーションで使用して、更新されたセッション ID を取得します。
- アプリケーションが起動します。
PIN セキュリティ
Salesforce 接続アプリケーションには、アプリケーションでの PIN 保護を介した追加のセキュリティレイヤーがあります。この PIN 保護はモバイルアプリケーション自体のものであり、デバイスの PIN 保護や Salesforce 組織が提供するログインセキュリティとは異なります。
PIN 保護を使用するためには、開発者が接続アプリケーションの作成時に [画面ロックと PIN 保護を実装] チェックボックスをオンにする必要があります。オンにすることで、モバイルアプリケーション管理者が、PIN 保護の強制実行、タイムアウト期間のカスタマイズ、PIN の長さの設定を行うかどうかを選択できます。
実際には、PIN 保護を使用して、モバイルアプリケーションが指定した時間 (分単位) 使用されていない場合に動作を停止させることができます。モバイルアプリケーションがバックグラウンドに渡されても、経過時間は引き続き記録されます。
PIN 保護のしくみは、次のとおりです。
- 電話を有効にし、デバイスの PIN を入力します。
- 顧客が Mobile SDK アプリケーションを起動します。
- Salesforce 組織のログイン情報を入力します。
- 顧客が Mobile SDK アプリケーションの PIN コードを入力します。
- アプリケーションで操作を行い、別のアプリケーションを開く (電話の受信など) ことによってアプリケーションをバックグラウンドに送ります。
- アプリケーションがタイムアウトになります。
- 顧客がアプリケーションを再び開くと、アプリケーションの PIN 画面 (デバイス用ではなく、Mobile SDK アプリケーション用) が表示されます。
- アプリケーションの PIN を入力し、操作を再開できます。
OAuth 2 ユーザーエージェントフロー
ユーザーエージェントフローでは、クライアントアプリケーションを Salesforce API と統合する接続アプリケーションは、アクセストークンを HTTP リダイレクトとして受信します。接続アプリケーションは、ユーザーエージェントを Web サーバーまたはアクセス可能なローカルリソースにリダイレクトするよう認証サーバーに要求します。Web サーバーは応答からアクセストークンを抽出して接続アプリケーションに渡すことができます。セキュリティ上の理由により、トークン応答は、URL でハッシュタグ (#) フラグメントとして指定されます。この形式は、サーバーや、参照ヘッダー内の他のサーバーにトークンが渡されないようにします。
警告
アクセストークンはエンコードされてリダイレクト URI に挿入されているため、ユーザーや、デバイス上の他のアプリケーションに公開される場合があります。
たとえば、Salesforce Mobile SDK を使用して、Salesforce 組織にある顧客の連絡先情報を検索するモバイルアプリケーションを構築するとします。Mobile SDK は、接続アプリケーションに OAuth 2.0 ユーザーエージェントフローを実装し、モバイルアプリケーションを Salesforce API に統合して、定義したデータに対する承認されたアクセスを許可します。フローは次の手順に従います。
- エンドユーザーがモバイルアプリケーションを開きます。
- このモバイルアプリケーションを認証して承認するために、接続アプリケーションがユーザーを Salesforce にリダイレクトします。
- ユーザーはこの認証フローのアクセスを承認します。
- 接続アプリケーションが Salesforce からリダイレクト URL へのコールバックを受信し、アクセストークンと更新トークンを抽出します。
- 接続アプリケーションがこのアクセストークンを使用して、エンドユーザーの代わりにデータにアクセスします。
接続アプリケーション
接続アプリケーションは、API を使用して、アプリケーションを Salesforce と統合します。接続アプリケーションは、標準の SAML および OAuth プロトコルを使用して認証し、シングルサインオンと Salesforce API で使用するトークンを提供します。接続アプリケーションでは、標準の OAuth 機能に加え、Salesforce システム管理者がさまざまなセキュリティポリシーを設定したり、対応するアプリケーションを使用できるユーザーを明示的に制御したりすることができます。
接続アプリケーションの作成時に指定する情報の一般的なリストを次に示します。
- 名前、説明、ロゴ、連絡先情報
- Salesforce がアプリケーションを見つけて認証または識別できるようにするための URL
- 認証プロトコル: OAuth、SAML、またはその両方
- IP 範囲 (省略可能)。この範囲のユーザーが接続アプリケーションにログインできます
- 接続アプリケーションが適用できる、モバイルポリシーに関する情報 (省略可能)
Salesforce Mobile SDK アプリケーションは、接続アプリケーションを使用して Salesforce OAuth サービスにアクセスし、Salesforce REST API をコールします。
範囲パラメーターの値
OAuth では、サーバーおよびクライアントの両方に範囲設定が必要です。サーバー側とクライアント側間の同意によって、範囲に関する契約が定義されます。
-
サーバー側 — Salesforce サーバーの接続アプリケーションで、範囲権限を定義します。この設定により、Mobile SDK アプリケーションなど、クライアントアプリケーションが要求できるアクセスレベルが決まります。少なくとも、コードで指定した内容に合わせて接続アプリケーションの OAuth 設定を指定します。ほとんどのアプリケーションでは、refresh_token、web、api で十分です。
-
クライアント側 — Mobile SDK アプリケーションで範囲要求を指定します。クライアントの範囲要求は、接続アプリケーションの範囲権限のサブセットである必要があります。
サーバー側の設定
次の範囲パラメーター値を設定できます。
値 |
説明 |
---|---|
api |
REST API や Bulk API などの API を使用して、現在のログインユーザーのアカウントへのアクセスを許可します。この値には、Chatter REST API リソースへのアクセスを許可する chatter_api も含まれます。 |
chatter_api |
Chatter REST API リソースへのアクセスのみを許可します。 |
custom_permissions |
接続アプリケーションに関連付けられている組織のカスタム権限へのアクセスを許可し、現在のユーザーで各権限が有効かどうかを示します。 |
full |
ログインユーザーがアクセスできるすべてのデータへのアクセスを許可し、その他すべての範囲が対象となります。full は更新トークンを返しません。更新トークンを取得するには、refresh_token の範囲を明示的に要求する必要があります。 |
id |
ID URL サービスへのアクセスを許可します。profile、email、address、phone を要求すれば、id を使用した場合と同じ結果を個別に得られます。これらの結果はすべて一致します。 |
openid |
OpenID Connect アプリケーションの現在のログインユーザーの一意の識別子へのアクセスを許可します。 アクセストークンの他にも、「OpenID Connect の仕様」に従って、OAuth 2.0 ユーザーエージェントフローおよび OAuth 2.0 Web サーバー認証フローで openid 範囲を使用して、署名付き ID トークンを受信します。 |
refresh_token |
更新トークンを受信できる場合に、それを返すように指定します。これにより、ユーザーがオフラインのときにアプリケーションがユーザーのデータを操作できます。これは、offline_access を要求した場合と同じ意味になります。 |
visualforce |
顧客が作成した Visualforce ページへのアクセスを許可します。標準の Salesforce UI へのアクセスは許可しないでください。 |
web |
Web で access_token を使用することを許可します。visualforce が含まれているため、顧客が作成した Visualforce ページへのアクセスが許可されます。 |
クライアント側の設定
Mobile SDK アプリケーションの範囲の設定は、次のルールで制御されます。
範囲 |
Mobile SDK アプリケーションの設定 |
---|---|
refresh_token |
アプリケーションの Mobile SDK から暗黙的に要求されます。アプリケーションの範囲リストに含める必要はありません。 |
api |
Salesforce REST API コールを行う場合に含めます (ほとんどのアプリケーションに適用されます)。 |
web |
Salesforce 組織で定義されたページにアプリケーションからアクセスする場合に含めます (Salesforce ベースの Web ページを読み込むアプリケーションの場合)。 |
full |
すべての権限を要求する場合に含めます。(Mobile SDK では、refresh_token が暗黙的に要求されます)。 |
chatter_api |
アプリケーションから Chatter REST API をコールする場合に含めます。 |
id |
(不要) |
visualforce |
代わりに、web を使用します。 |
接続アプリケーションの作成
接続アプリケーションの作成は簡単ですが、管理者権限が必要です。Developer Edition 組織または Trailhead Playground 組織では、自動的にこれらの権限が付与されています。
- Trailhead Playground 組織または Developer Edition 組織で、[設定] に移動します。
- 次のいずれかの手順を実行します。
- Salesforce Classic を使用している場合は、[作成] | [アプリケーション] を選択し、[接続アプリケーション] までスクロールして [新規] をクリックします。
- Lightning Experience を使用している場合は、[アプリケーション] | [アプリケーションマネージャー] を選択し、[新規接続アプリケーション] をクリックします。
-
[基本情報] で、フォームに次のように入力します。
-
接続アプリケーション名: <任意の名前。スペースを含めることができます>
-
API 参照名: 推奨値を受け入れます。
-
取引先責任者 メール: メールアドレスを入力します。
- API ([OAuth 設定の有効化]) で、[OAuth 設定の有効化] をオンにします。
-
[コールバック URL] に、<mysampleapp://auth/success など、任意 (実在または架空) の URL> を設定します。自動入力で候補が表示されても選択しないでください。代わりに、コールバック URL を手入力します。
-
[利用可能な OAuth 範囲] で、以下を選択します。
-
API を使用してユーザーデータを管理 (api)
-
Web ブラウザーを使用してユーザーデータを管理 (web)
-
いつでも要求を実行 (refresh_token, offline_access)
-
[Add (追加)] をクリックします。この最小の範囲セットは、ほとんどの Mobile SDK アプリケーションに適しています。
-
[Require Secret for Web Server Flow (Web サーバーフローの秘密が必要)] をオフにします。
-
[保存] をクリックします。
設定を保存すると、新しい接続アプリケーションの詳細が表示されます。
- [コールバック URL] と [コンシューマー鍵]。Mobile SDK アプリケーションを配布する前に、これらの値をアプリケーションの設定にコピーします。
- Mobile SDK アプリケーションではコンシューマーの秘密は使用しないため、この値は無視できます。
Mobile SDK アーキテクチャとセキュリティについて多少なりともわかったところで、Mobile SDK を実際に試してみましょう。まずは次の Challenge を始めましょう。必要なものは Developer Edition または Trailhead Playground のみです。その後「Set Up Your Mobile SDK Developer Tools (Mobile SDK 開発者ツールの設定)」プロジェクトを完了することをお勧めします。
リソース