QA@IT

JavaScriptによるJSON取得について(SalesForce&REST API+OAuth)

11303 PV

JavaScriptを使って、SalesForceからREST API+OAuthを経由してJSONを取得するプログラムを作成しようとしています。
ただ、JavaScriptでSalesForceにOAuthを用いて認証して、REST APIを通してJSONを返すというフローは頭で理解で来ているのですが、コードにすることができません。

やろうとしていることは下記のコードに近いのです。

var password = 'userPassword' + 'securityToken'
$.ajax({
type: 'GET',
url: 'https://login.salesforce.com/services/oauth2/token',
contentType: 'application/json',
dataType: 'json',
beforeSend: function(xhr) {
xhr.setRequestHeader('grant_type','password'),
xhr.setRequestHeader('client_id', ''),
xhr.setRequestHeader('client_secret', '<client_secret_here'),
xhr.setRequestHeader('username', 'username@location.com'),
xhr.setRequestHeader('password', "password")
},
success: function(response) {
console.log('Successfully retrieved ' + response);
//Other logic here
},
error: function(response) {
console.log('Failed ' + response.status + ' ' + response.statusText);
//Other logic here
}
});

ただし、このコードを実行しようとすると、下記エラーが返ってきます。

1) OPTIONS https://login.salesforce.com/services/oauth2/token 400 (Bad Request)

2) XMLHttpRequest cannot load https://login.salesforce.com/services/oauth2/token. No
'Access- Control-Allow-Origin' header is present on the requested resource.
Origin http://localhost is therefore not allowed access.

実現したい処理をしているものとして下記URLが近いのですが…
https://stomita-lab.s3.amazonaws.com/sfdc-oauth2/hello.html

こちらはJSONではなく、SOAPを用いて、XMLを返しています…。
上記URLの処理にREST APIを用いてJSONを返す処理をさせることができれば良いと考えていますが…
コードが浮かびません…。

お知恵を拝借できればと思います。

回答

そのエラーについてですが

No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin http://localhost is therefore not allowed access.

はクロスドメインでのリクエストであるために発生しているエラーです。
salesforce.comのページ上でスクリプトが実行できるならそのエラーは出なくなります。

どういう環境で実行されているのかわかりませんがエラー通りlocalhostからアクセスするには、エラーメッセージにある通り Access-Control-Allow-Originヘッダをサーバーが返す必要があります(*やlocalhostに対しては許可してくれないようには思いますが)。

普通であれば別サーバー経由、例えばタグにjsonpが上がってますので、jsonpを利用するなどすれば回避できたりもするのですが、accesstokenなども持っているので慎重に通信内容を決める必要があると思います。

詳細は見ていませんが、 https://github.com/developerforce/Force.com-JavaScript-REST-Toolkit というのが目的にあいそうな気がしますが、どうでしょうか。

https://developer.salesforce.com/page/JavaScript

JavaScript in Visualforce pages cannot directly make use of the Force.com REST API due to same origin policy enforcement. To workaround this problem, ...

と書いてあるので回避できるかもしれません。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。