質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

3869閲覧

SalesForceへのAPI接続時のinvalid_grantエラー

peterpan

総合スコア19

Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/29 11:28

お問い合わせフォームとSalesForceのAPI連携を実施しております。
実施内容は下記の通りです。invalid_grantエラーにより接続が出来ません。

// エラー内容 URL : https://login.salesforce.com/services/oauth2/token Status : 400 response : error = invalid_grant, error_description = authentication failure curl_error : curl_errno : 0
// 連携用PHPファイルに記述した内容 // APIToolkit require_once ('oauth/oauth.php'); define("DATABASEDOTCOM_CLIENT_ID", "Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」"); define("DATABASEDOTCOM_CLIENT_SECRET", "Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」"); define("DATABASEDOTCOM_CLIENT_USERNAME", "Salesforce REST API接続用のSalesforceユーザ"); define("DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD", "Salesforce REST API接続用のSalesforceユーザのパスワード"); define("DATABASEDOTCOM_HOST", "Salesforce REST APIエンドポイント"); ///// Salesforce REST API接続用の設定 $CACHE_DIR = '/home/homepage/tmp/session'; $CALLBACK_URL = 'https://www.test.co.jp/contact/'; // Salesforce REST API接続用のOauthインスタンスを生成 $oauth = new oauth(DATABASEDOTCOM_CLIENT_ID, DATABASEDOTCOM_CLIENT_SECRET, $CALLBACK_URL, DATABASEDOTCOM_HOST, $CACHE_DIR); // Salesforce REST API接続にあたりSalesforceへの認証を実行 $oauth->auth_with_password(DATABASEDOTCOM_CLIENT_USERNAME, DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD); // 以下は省略
// oauth.phpの内容(一部を抜粋) class oauth { public $client_id; public $client_secret; public $login_url; public $token_url; public $callback_url; public $access_token; public $refresh_token; public $instance_url; public $cache_dir; public $error = FALSE; public $error_msg = array(); public function __construct($client_id, $client_secret, $callback_url, $login_url = 'https://login.salesforce.com', $cache_dir = '.'){ $this->client_id = $client_id; $this->client_secret = $client_secret; $this->callback_url = $callback_url; $this->login_url = $login_url; $this->token_url = $login_url . "/services/oauth2/token"; $this->cache_dir = $cache_dir; } public function auth_with_password($username, $password, $lifetime = 60){ $this->refresh_cache_on_filesystem($lifetime); if ($this->error){ return(FALSE); } $this->read_cache_from_filesystem(); if ($this->error){ return(FALSE); } if (empty($this->access_token) || empty($this->instance_url)){ $fragment = "grant_type=password" . "&client_id=" . $this->client_id . "&client_secret=" . $this->client_secret . "&username=" . $username . "&password=" . urlencode($password); $response = $this->send($fragment); if ($this->error){ // ここでFALSEがリターンされている。 return(FALSE); } $this->access_token = $response['access_token']; $this->refresh_token = ''; $this->instance_url = $response['instance_url']; $this->save_to_filesystem(); if ($this->error){ return(FALSE); } } return(TRUE); } private function send($fragment){ $curl = curl_init($this->token_url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $fragment); curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1); $response = json_decode(curl_exec($curl), true); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($status == 400 && $response['error_description'] == 'expired authorization code') { //access code has been expired $this->set_error('new code required'); } elseif ( $status != 200 ) {        // エラー内容 $this->set_error("<h1>Curl Error</h1><p>URL : $this->token_url </p><p>Status : $status</p><p>response : error = " . $response['error'] . ", error_description = " . $response['error_description'] . "</p><p>curl_error : " . curl_error($curl) . "</p><p>curl_errno : " . curl_errno($curl) . "</p>"); } curl_close($curl); return($response); } }

公式ヘルプには下記のように記されておりますが、
ログイン情報や接続アプリケーションの設定に関しては問題ないと認識しております。
イメージ説明

質問:OAuth認証で上手くいっていない原因を、特定は難しいと思いますが、教えていただけますでしょうか?また、token_urlが「https://login.salesforce.com/services/oauth2/token」となり、その接続先がJSONではなくXML形式なのは問題に関係していますでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問