2014-12-03 2 views
0

다음 Curl 스크립트를 Java로 변환하여 액세스 토큰을 얻으려고했지만 400이나 401에서 항상 실패하는 것 같습니다. 무엇을 잘못하고 있습니까? java에 대한 컬 변환은 아래에서 올바르게 수행됩니까? ...Crittercism Curl Script to Java HttpUrlConnection

컬 스크립트를 조언을 주시기 바랍니다 :

curl -X POST https://developers.crittercism.com/v1.0/token -u WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo -d 'grant_type=password&[email protected]&password=riTiBw28%3DpmFu' 

, "WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo"는 OAUTH 된 ClientID입니다.

자바 코드 :

String url = "https://developers.crittercism.com/v1.0/token"; 
    String urlParameters = "grant_type=password&[email protected]&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 

답변

0

이제 작동 중입니다! 클라이언트 ID 뒤에 콜론이 필요하지 않으므로 제거하면 작동합니다. 하지만 실제로 작동하도록 만들었던 것은 아마도 내가 추가 한 추가 요청 헤더 속성 일 것입니다. 어쨌든, 시간을내어 주신 분들께 감사드립니다!

0

에서와 같이 64 기수에게 인코딩 CLIENT_ID뿐만 아니라 클라이언트 암호를 포함해야 encoded 문자열 :

String encoded = new String(Base64.encodeBase64(new String(clientID + ":" + clientPassword))); 
1

david @ crittercis m.com 여기, 당신이 읽고있는 문서를 썼고 이것으로 돕고 싶습니다. API에서 설명적인 오류 메시지를 반환하는 데 많은주의를 기울였습니다. 게시 할 수 있다면 매우 유용 할 것입니다.

몇 가지 확인 :

  • WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo 우리의 시스템에 유효한으로 OAuth2 클라이언트 ID 아니다 (난 그냥 확인). 앱에 대한 OAuth2 클라이언트 ID가 있어야합니다. 현재 우리는이를위한 자동화 된 프로세스가 없습니다 (전자 메일 지원이 필요합니다). 그러나 그것은 우리의 로드맵에 있습니다.
  • cURL 명령에서 -u는 "Basic Authorization"을 의미합니다. 당신은 바로 그 부분을 가지고 있습니다. 현재 공개 클라이언트 (기밀이 아님) 만 지원하므로 OAuth2 클라이언트 ID와 함께 비밀번호를 사용할 필요가 없습니다. 그러나 손으로 문자열을 구성하기 때문에 암호가없는 경우에도 사용자 이름과 암호 사이에 콜론을 넣어야한다고 표준에서 규정하고 있습니다. 따라서 클라이언트 ID WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo의 경우 최종 사전 인코딩 문자열은 "WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo :"이며, 이는 "V1YzdjdaVGJZbXF0VU9NTnZPN29QaExpOFJOOXpGb286"(Hans에서 언급 한대로)로 인코딩됩니다.

이 중 하나가 작동하는지 알려주십시오.

+0

안녕하세요, David, 답장을 보내 주셔서 감사합니다. 이메일 지원을 통해 유효한 oAuth ID를 받았습니다. 언급 한 내용을 변경 한 후에도 진행이 없습니다. 위의 편집 된 코드를 확인하십시오. OP에 던져진 오류 예외도 추가했습니다. FYI에서는 curl 스크립트가 cmd 프롬프트에서 성공적으로 실행되고 액세스 토큰을 반환합니다. – Ram