web-dev-qa-db-ja.com

どうすればgrant_type = password oauthフローをsalesforce.comで使用できますか?

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など)を送信している場合でも、このエラーが発生するようです。

私は答え ここ の提案を試しましたが、それらは私にはうまくいきません。

8
Symmetric

通常、これはcontent-typeヘッダーが正しい値に設定されていないため、application/x-www-form-urlencodedである必要があります。

また、パラメータが正しくエンコードされていることを確認してください(特に、POSTペイロードを手動で作成している場合)。

21
superfell

以下は、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()));
}
6
Chirag Mehta

フォームデータでgrant_typeを「パスワード」として設定する必要があります。下記参照。

フォームデータを渡す必要がありますadgrant_type = password&username = nilavghosh%40gmail.com&password = ******

0