SOAP API login()廃止への対応:OAuthによるアクセストークン取得実装ガイド

SOAP API login()廃止への対応:OAuthによるアクセストークン取得実装ガイド 実装事例
SOAP API login()廃止への対応:OAuthによるアクセストークン取得実装ガイド

どんな取り組みか

Salesforceは、将来のSummer ’27リリースをもって、特定のAPIバージョンのSOAP API login() メソッドを廃止し、サポートを終了することを発表しました。この変更は、これまでBulk APIの処理などでlogin()メソッドを利用して認証を行っていた外部クライアントアプリケーションに影響を与えます。

この変更に対応するため、従来のlogin()メソッドに代わり、OAuth 2.0を利用した認証フローへの移行が推奨されています。本記事では、外部クライアントアプリケーションを設定し、OAuthのClient Credentials Grantフローを用いてアクセストークンを取得する具体的な実装方法を、シェルスクリプトとApexのコード例を交えて解説します。

使われた技術スタック

  • Salesforce: SOAP API, Bulk API, OAuth 2.0, 外部クライアントアプリケーション, Apex
  • サーバーサイド/スクリプト: Linuxシェルスクリプト, PHP
  • ツール: curl
  • データ形式: XML, JSON

実装のポイント

login()メソッドの廃止に伴う主な対応は、OAuth 2.0認証フローを実装し、アクセストークンを取得してAPIリクエストを行うことです。以下に、シェルスクリプトとApexでの実装ポイントを詳述します。

外部クライアントアプリケーションの設定

まず、Salesforce組織内で「外部クライアントアプリケーション」を設定する必要があります。これにより、APIアクセスのためのクライアントID(client_id)とクライアントシークレット(client_secret)が発行されます。これらがOAuthフローでアプリケーションを認証するための鍵となります。OAuthポリシーの設定もここで行います。

シェルスクリプトによるアクセストークン取得

Linux環境などのシェルスクリプトで処理を自動化している場合、curlコマンドを用いてアクセストークンを取得できます。Client Credentials Grantフローを利用し、SalesforceのOAuthトークンエンドポイントにPOSTリクエストを送信します。

以下は、curlコマンドでトークンを要求する例です。grant_typeclient_credentialsを指定し、発行されたクライアントIDとシークレットを渡します。

$mycurl https://xxxxx.sandbox.my.salesforce.com/services/oauth2/token -d 'grant_type=client_credentials' -d'client_id=??????????' -d 'client_secret=????????' -d 'format=xml'

このリクエストにより、XML形式でアクセストークンを含むレスポンスが返されます。

<?xml version="1.0" encoding="UTF-8"?>
<OAuth>
 <access_token> ??????????? </access_token>
 <signature> ??????? </signature>
 <scope> api </scope>
 <instance_url> https://xxxx.sandbox.my.salesforce.com </instance_url>
 <id> https://test.salesforce.com/id/00Dyyyyyy/005rrrrr </id>
 <token_type> Bearer </token_type>
 <issued_at> 0000000 </issued_at>
</OAuth>

元記事では、このXMLレスポンスをシェルスクリプトで扱いやすくするために、PHPスクリプト(sfdc-tag2.php)を用いてユニケージのTAG形式に変換しています。

#!/usr/bin/php -q
<?php
//############################################
//# XMLを読んでユニケージ用のファイルをつくる
//# シングルレベルのアイテムタイプ用
//# TAG形式に変換します
//############################################
function sxiToArray ( $sxi ){
 $a = true ;
 if ( $sxi -> count () == 0 ) {
  echo $sxi -> getName () . " " . $sxi -> __toString () . " \n " ;
 }
 foreach ( $sxi as $key => $value ) {
  if ( $value -> count () > 0 ) {
   foreach ( $value -> children () as $child ) {
    $a = sxiToArray ( $child );
   }
  }
 }
 return $a ;
}

while ( true ) {
 $stdin = trim ( fgets ( STDIN ));
 if ( $stdin === '' ) {
  $xmlstr = join ( ' ' , $stdins );
  $xml = new SimpleXMLElement ( $xmlstr );
  $aaa = sxiToArray ( $xml );
  return ;
 }
 $stdins [] = $stdin ;
}
?>

変換後、シェル変数にアクセストークンとインスタンスURLを格納し、後続のAPI呼び出しで使用します。Authorizationヘッダーに「Bearer {アクセストークン}」の形式で指定します。

access_token=$(nameread access_token $tmp-loginInfo)
instance_url=$(nameread instance_url $tmp-loginInfo)

curl_com="$my_instance_url/services/data/v64.0/limits -H \"Authorization: Bearer $access_token\" "

Apexによるアクセストークン取得

Salesforceプラットフォーム内からAPIを呼び出す場合、ApexのHttpクラスを利用してアクセストークンを取得できます。実装方法はシェルスクリプトの場合と似ており、トークンエンドポイントにPOSTリクエストを送信します。

以下はApexでの実装例です。HttpRequestオブジェクトを生成し、エンドポイント、メソッド、リクエストボディを設定します。ボディにはgrant_typeclient_idclient_secretを含めます。

public static String getToken () {
    Http http = new Http ();
    String path = ' https: //xxxxx.sandbox.my.salesforce.com/services/oauth2/token';
    HttpRequest req = new HttpRequest ();
    req . setEndpoint ( path );
    req . setMethod ( ' POST ' );
    String ClientId = '' ;
    String ClientSecret = '' ;
    req . setBody ( ' grant_type = client_credentials ' + ' & client_id = ' + ClientId + ' & client_secret = ' + ClientSecret );
    HttpResponse res = http . send ( req );
    BodyToken t = ( BodyToken ) JSON . deserializeStrict ( res . getBody (), BodyToken . class );
    return t . access_token ;
}

public class BodyToken {
    public String access_token ;
    public String instance_url ;
    public String scope ; 
    public String id ;
    public String token_type ;
    public String issued_at ;
    public String signature ;
}

レスポンスはJSON形式で返ってくるため、JSON.deserializeStrictメソッドと内部クラス(BodyToken)を使ってパースし、アクセストークンを抽出します。

得られた成果や学び

login()メソッドの廃止という具体的なAPIの変更に対し、OAuth 2.0というモダンで標準的な認証方式へ移行するための実践的なノウハウが得られます。特に、シェルスクリプトとApexという異なる実行環境での具体的なコード例は、多様なシステム連携の改修に役立ちます。

この取り組みを通じて、従来の認証方法から脱却し、よりセキュアなAPI連携を実現するプロセスを具体的に理解することができます。

まとめ

SalesforceのSOAP API login()メソッドの廃止は、外部アプリケーション連携に影響を与える重要な変更です。しかし、本記事で紹介したように、外部クライアントアプリケーションを設定し、OAuth 2.0のClient Credentials Grantフローを利用することで、既存の処理を新しい認証方式へ移行させることが可能です。

提供されているシェルスクリプトやApexのコード例を参考にすることで、影響を受けるシステムの改修をスムーズに進めることができるでしょう。

出典: https://qiita.com/Keiji_otsubo/items/55ca30e8338fda28ef5b

Related Certifications

この記事に関連する技術領域の認定資格

Salesforce 関連資格

  • Salesforce Certified Administrator
  • Salesforce Certified Platform Developer I
  • Salesforce Certified Platform Developer II
  • Salesforce Certified Application Architect
  • Salesforce Certified System Architect
  • Salesforce Certified Technical Architect

※ 認定資格は技術スキルの体系的な学習に役立ちます。試験の出題範囲や受験要件は変更される場合があるため、受験前に必ず公式サイトで最新情報をご確認ください。

SF Tech & Win

Salesforce × AWS × AI 連携の実装ノウハウ

SIer・スタートアップ・中小企業のDX推進に役立つアーキテクチャ事例・実装パターン・最新アップデート情報を毎朝配信。

コメント

タイトルとURLをコピーしました