0

我一直在尝试将以下 Curl 脚本转换为 Java 以获取访问令牌,但似乎总是以 400 或 401 失败。我做错了什么?curl 到 java 的转换是否在下面正确完成?请指教...

卷曲脚本:

curl -X POST https://developers.crittercism.com/v1.0/token -u WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo -d 'grant_type=password&username=david@crittercism.com&password=riTiBw28%3DpmFu'

其中,“WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo”是 oAuth ClientID。

Java 代码:

    String url = "https://developers.crittercism.com/v1.0/token";
    String urlParameters = "grant_type=password&username=myemail@email.com&password=secretpass";
    String clientId = "nD8FiwFiOB1rpU5HVc2ESyRAwbFOOO:";  //Just for ref

    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
    con.setDoOutput(true);
    con.setDoInput(true);

    //add request header
    String basicAuth = new String(Base64.encode(clientId.getBytes()));
    con.setRequestProperty ("Authorization", String.format("Basic %s", basicAuth));
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    con.setRequestProperty("Accept", "*/*");
    con.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
    con.setRequestMethod("POST");

    // Send post request
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

被抛出的异常,

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: https://developers.crittercism.com/v1.0/token
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at CrittercismClient.sendPost(CrittercismClient.java:102)
at CrittercismClient.main(CrittercismClient.java:26)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://developers.crittercism.com/v1.0/token
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at CrittercismClient.sendPost(CrittercismClient.java:96)
... 1 more
4

3 回答 3

1

david@crittercism.com 在这里,我写了您正在阅读的文档,并且很乐意为此提供帮助。我非常小心地从 API 返回描述性错误消息,如果您可以发布这些消息,那将非常有帮助。

需要检查的几件事:

  • WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo在我们的系统中不是有效的 OAuth2 客户端 ID(我刚刚检查过)。确保您获得应用的 OAuth2 客户端 ID。目前,我们没有为此提供自动化流程(您必须通过电子邮件发送支持),但它在我们的路线图中。
  • 在 cURL 命令中,-u 表示“基本授权”;你说对了。我们目前仅支持公共客户端(非机密),这意味着您无需使用带有我们 OAuth2 客户端 ID 的密码。但是,由于您是手动构建字符串,因此标准规定您必须在用户名和密码之间放置一个冒号,即使没有密码也是如此。因此,对于客户端 ID WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo,最终的预编码字符串将是“WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo:”,它将编码为“V1YzdjdaVGJZbXF0VU9NTnZPN29QaExpOFJOOXpGb286”(如 Hans 所述)。

让我知道这些是否有效。

于 2014-12-03T23:04:06.683 回答
0

encoded字符串应包含 base64 编码的 client_id 以及客户端密码,如下所示:

String encoded = new String(Base64.encodeBase64(new String(clientID + ":" + clientPassword)));
于 2014-12-03T08:29:36.270 回答
0

它现在正在工作!发现在clientID之后不需要冒号,删除它使其工作。但我敢打赌,真正使它起作用的可能是我添加的额外请求标头属性。无论如何,感谢您的时间!

于 2014-12-04T03:05:35.973 回答