16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Salesforce 指定ログイン情報で自組織にAPIアクセス

Posted at

#[概要]
SalesforceでApex Batch等で画面のようにログインユーザのセッションIDが存在しないような
処理で自組織のメタデータをToolingAPI経由で取得する手法として
本記事に記載する方法を紹介します。
具体的には、接続アプリケーション、外部認証プロバイダ、指定ログイン情報の機能を使用して実現します。

それぞれの機能の概要は、以下となります。
###接続アプリケーション
https://help.salesforce.com/articleView?id=connected_app_overview.htm&type=5

接続アプリケーションは、API を使用してアプリケーションを Salesforce と統合します。接続アプリケーションは、標準の SAML および OAuth プロトコルを使用して認証し、シングルサインオンと Salesforce API で使用するトークンを提供します。接続アプリケーションでは、標準の OAuth 機能に加え、Salesforce システム管理者がさまざまなセキュリティポリシーを設定したり、対応するアプリケーションを使用できるユーザを明示的に制御したりすることができます。

###外部認証プロバイダ
https://help.salesforce.com/articleView?id=sso_authentication_providers.htm&type=5

認証プロバイダは外部サービスプロバイダのログイン情報を使用して、Salesforce 組織にユーザがログインできるようにします。Salesforce では、Google、Facebook、Twitter、LinkedIn など、OpenID Connect プロトコルをサポートするアプリケーション用の認証プロバイダが提供されます。OpenID Connect をサポートしないアプリケーションには、カスタム認証プロバイダを作成するための Apex の Auth.AuthProviderPluginClass 抽象クラスが提供されます。

今回は、自組織への認証に使用するので、プロバイダタイプは「Salesforce」を利用します。
詳細は、こちらを参照ください。
https://help.salesforce.com/articleView?id=sso_provider_sfdc.htm&type=5

###コールアウトエンドポイントとしての指定ログイン情報
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_callouts_named_credentials.htm#!

指定ログイン情報では、1 つの定義にコールアウトエンドポイントの URL と必要な認証パラメータを指定します。Apex コールアウトで指定ログイン情報をコールアウトエンドポイントとして指定するすべての認証が Salesforce によって管理されるため、コードでこれらを行う必要はありません。指定ログイン情報で定義されたサイトについては、外部サイトへのコールアウトに必要なリモートサイト設定もスキップできます。

#[用語]
###アクセストークン
https://help.salesforce.com/articleView?id=remoteaccess_terminology.htm&type=5

ユーザの Salesforce ログイン情報を使用する代わりに、保護されたリソースへのユーザのアクセスを許可するためにコンシューマによって使用される値。

###コールバック URL

クライアントアプリケーションに関連付けられた URL。場合によっては、URL は、クライアントの Web ブラウザのリダイレクト先である実際の URL にする必要があります。それ以外では、URL は実際には使用されませんが、クライアントアプリケーションとサーバ (接続アプリケーション定義) との間で値が一致する必要があります。

###コンシューマ

Salesforce ユーザとアプリケーションの両方をユーザの代わりに認証するために OAuth を使用する Web サイトまたはアプリケーション。

###コンシューマ鍵

Salesforce で識別するためのコンシューマによって使用される値。OAuth 2.0 では client_id と呼ばれます。

###コンシューマの秘密

コンシューマ鍵の所有権を確立するためにコンシューマにより使用される秘密。OAuth 2.0 では client_secret として参照されます。

###更新トークン

OAuth 2.0 のみで使用できます。新しいアクセストークンを取得するためにコンシューマが使用するトークン。エンドユーザがアクセスを再度承認する必要がありません。

#[手順]
※今回の設定は、DE環境で実施します。
1. 指定ログイン情報のOAuth認証で使用する接続アプリケーションを作成します。
1-1. アプリケーション>アプリケーションマネージャで、新規接続アプリケーションを選択します。
1-2. 新規接続アプリケーションの必要情報を入力します。
ポイントとしては、この時点ではコールバックURLが確定していないので仮の値を設定します。2.で認証プロバイダを作成するとコールバックURLが決まるのでその後で再設定します。ちなみに、先に接続アプリケーションを設定するのは、認証プロバイダの設定でコンシューマ鍵の情報が必要となるからとなります。
image.png

2. 接続アプリケーションで使用する認証プロバイダを作成します。

2-1.ID>認証プロバイダで新規を選択します。
2-2.認証プロバイダの必要情報を入力します。
コンシューマ鍵、コンシューマの秘密は、1.で作成した接続アプリケーションから取得して設定します今回のOAuth認証で利用するのは、"refresh_token api"のみなので、デフォルトの範囲をそのように設定します。
image.png

3. 2.で作成したプロバイダのコールバックURLを1.で作成した接続アプリケーションに設定します。

4. 指定ログイン情報を作成します。
認証プロバイダには、先ほど作成したものを選択します。
image.png

5. 指定ログインの保存時に認証ユーザでの認可を行います。
image.png

6. 最後にApexからの呼び出しで正しくコールできるかを確認します。
開発者コンソールのExecute Anonymous Windowで以下を実行します。
String endPoint = 'callout:Test_Connection/services/data/v43.0/tooling/sobjects'; HttpRequest req = new HttpRequest(); req.setEndpoint( endPoint ); req.setHeader( 'Content-Type', 'application/json' ); req.setMethod( 'GET' ); Http http = new Http(); HTTPResponse res = http.send( req ); System.debug( res.getBody() );

7. デバックログの結果を確認します。以下のようなログが出力されていれば、成功となります。
image.png

これで、自組織にセッションIDがないような機能(Apex Batch等)で指定ログイン情報を用いることでToolingAPIへのアクセスを行うことができるようになりました。

16
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?