Username-Passwordフローを使用して認証トークンを取得しようとしています( this の記事の最後のセクションで説明されています)。
私は次のリクエストを送信しています(関連する場合は、Pythonのhttplibを使用して):
https://login.salesforce.com/services/oauth2/token
POST data:
username=<un>&client_secret=<consumer_secret>&password=<pw+token>&grant_type=password&client_id=<consumer_key>
そして応答を得る:
400 Bad Request
{"error":"unsupported_grant_type","error_description":"grant type not supported"}
パスワードgrant_typeは本当にサポートされていませんか、それとも何かが足りませんか?確実に機能するgrant_type(authorization_codeなど)を送信している場合でも、このエラーが発生するようです。
私は答え ここ の提案を試しましたが、それらは私にはうまくいきません。
通常、これはcontent-typeヘッダーが正しい値に設定されていないため、application/x-www-form-urlencoded
である必要があります。
また、パラメータが正しくエンコードされていることを確認してください(特に、POSTペイロードを手動で作成している場合)。
以下は、Javaでsalesforce.comでgrant_type = password oauthフローを使用する方法に関する詳細な関数/ロジックです。
// Authenticate via OAuth
JSONObject response = oauthLogin();
System.out.println("Login response: " + response.toString(2));
if (!response.has("access_token")) {
throw new Exception("OAuth failed: " + response.toString());
}
..........................
private static JSONObject oauthLogin() throws Exception {
org.Eclipse.jetty.client.HttpClient jettyHttpClient = new org.Eclipse.jetty.client.HttpClient();
jettyHttpClient.start();
String url = LOGIN_SERVER + "/services/oauth2/token";
ContentExchange exchange = new ContentExchange();
exchange.setMethod("POST");
exchange.setURL(url);
String message = "grant_type=password&client_id=" + CLIENT_ID
+ "&client_secret=" + CLIENT_SECRET + "&username=" + USERNAME
+ "&password=" + PASSWORD;
exchange.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
exchange.setRequestContentSource(new ByteArrayInputStream(message
.getBytes("UTF-8")));
jettyHttpClient.send(exchange);
exchange.waitForDone();
return new JSONObject(new JSONTokener(exchange.getResponseContent()));
}
フォームデータでgrant_typeを「パスワード」として設定する必要があります。下記参照。
フォームデータを渡す必要がありますadgrant_type = password&username = nilavghosh%40gmail.com&password = ******