2012-07-05 3 views
0

칸 아카데미 API에 대한 OAuth 플로우를 이해하는 데 도움을 줄 수있는 사람이 누구나 있습니다. 다음 링크를 통해 액세스 할 수 있습니다. https://github.com/Khan/khan-api/wiki/Khan-Academy-API-Authentication이 API에 대한 OAuth 플로우를 알 수 없음

필자는 Scribe를 사용하고 있습니다. 여기

는 작업 코드 :

 OAuthService serv = new ServiceBuilder().provider(KhanApi.class) 
    .apiKey("").apiSecret("") 
    .build(); 
    Token token = new Token("", ""); 

    OAuthRequest req = new OAuthRequest(Verb.GET, 
    "http://www.khanacademy.org/api/auth/request_token"); 

    serv.signRequest(token, req); 

    Response resp = req.send(); 
    System.out.println(resp.getBody()); 

하면 해당 페이지로 사용자를 리디렉션하는 데 필요한 응답을 얻을 후. 그런 다음 요청 토큰이 포함 된 URL로 응답 성공적으로 로그인 한 브라우저 ... 여기

내가 시도하고 잘 작동하고 그 결과를하지 않은 두 개의 서로 다른 것들 후 :

1)

OAuthService serv = new ServiceBuilder().provider(KhanApi.class) 
.apiKey("***").apiSecret("***") 
.build(); 
Token token = serv.getRequestToken(); 

결과는 다음과 같습니다 스레드에서

예외는 "주요"org.scribe.exceptions.OAuthException : 응답 본체가 올바르지 않습니다. 이에서 토큰 비밀 추출 할 수 없습니다

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Login to Khan Academy</title> 

     <style> 
      #login-page { 
       padding-top: 18px; 
      } 
      .providers { 
       height: 100px; 
      } 
      .providers .provider .img-container { 
       height: 80px; 
      } 

      .horizontal-separator .separator-text { 
       background-color: white; 
       margin-left: 185px; 
      } 
      .pw-login { 
       width: 415px; 
       height: auto; 
       text-align: right; 
      } 
      .pw-login img.tree { 
       float: left; 
      } 

     </style> 


    </head> 
    <body> 
     <article id="login-page"> 
      <div id="login-inner-content"> 
       <form method="POST" 
        class="auth-form" 
        id="login-form" 
        action="https://khan-academy.appspot.com/login/mobileoauth"> 
       <h3>Login to Khan Academy</h3> 
       <input type="hidden" name="oauth_map_id" value="889298340"> 
       <input type="hidden" name="view" value="normal"> 


       <ul class="providers"> 
        <li class="provider action-gradient" title="Google"> 

      </div> 
     </article> 
    </body> 
</html>' 
    at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:41) 
    at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:27) 
    at org.scribe.oauth.OAuth10aServiceImpl.getRequestToken(OAuth10aServiceImpl.java:52) 
    at com.saeid.scribe.oauth.Main.main(Main.java:117) 

응답이 깨진 HTML 파일의 문자열 (이미지가 표시되지 않는 것을 의미에서 깨진 ...)

2) . 또한 나는 시도 :

OAuthRequest req = new OAuthRequest(Verb.GET, 
      "http://www.khanacademy.org/api/auth/request_token"); 

    Map<String, String> parameters = generateParameters("GET", 
      "http://www.khanacademy.org/api/auth/request_token"); 

    req.addQuerystringParameter("oauth_consumer_key", parameters.get("oauth_consumer_key")); 
    req.addQuerystringParameter("oauth_nonce", parameters.get("oauth_nonce")); 
    req.addQuerystringParameter("oauth_signature", parameters.get("oauth_signature")); 
    req.addQuerystringParameter("oauth_signature_method", parameters.get("oauth_signature_method")); 
    req.addQuerystringParameter("oauth_timestamp", parameters.get("oauth_timestamp")); 
    req.addQuerystringParameter("oauth_version", parameters.get("oauth_version")); 

    Response res = req.send(); 

결과는 다음과 내가 같은 바를 사용하고

OAuth error. Invalid signature. Expected signature base string: GET&http%3A%2F%2Fwww.khanacademy.org%2Fapi%2Fauth%2Frequest_token&oauth_consumer_key%3D***********%26oauth_nonce%3D1341526030%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1341526030%26oauth_version%3D1.0 

se 문자열을 사용하여 서명을 생성하고 HMAC-SHA1 메서드의 키로 소비자 키를 사용하고 있습니다.

다음은 KhanAPI의 모양입니다. import org.scribe.builder.api.DefaultApi10a; import org.scribe.model.Token;

공용 클래스 KhanApi는 DefaultApi10a {

@Override 
public String getAccessTokenEndpoint() { 
    return "http://www.khanacademy.org/api/auth/access_token"; 
} 

@Override 
public String getAuthorizationUrl(Token arg0) { 
    return ""; 
} 

@Override 
public String getRequestTokenEndpoint() { 
    return "http://www.khanacademy.org/api/auth/request_token"; 
} 

}

아무도 나를 도와 줄 수 을 확장? 감사합니다.

답변

1

Scribe가 필요한 OAuth 매개 변수를 모두 추가하고 서명을 수행합니까? 나는 기본 OAuth 1.0a 흐름을 기반으로하는 LinkedIn 예제를보고 있는데, 그런 식으로 아무것도하지 않는다. 정확히 스크 당신을 위해 무엇을하고 있는지

https://github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/LinkedInExample.java

수동으로 URL을 수립하고 직접 서명을해야하는 경우

?

+0

답장을 보내 주셔서 감사합니다. 네 말이 맞아요, 나는 또한 서기를 시험해 보았습니다.문제는 API 공급자가 API 클래스를 구현하는 데 필요한 authenticationURL을 제공하지 않는다는 것입니다. API의 맹세 흐름을 살펴보고 이해가 무엇인지 알려주시겠습니까? –

+0

API 공급자가 2-legged Oauth 만 지원한다고 말하고 있습니까? 그렇다면 Scribe가 (쉽게) 지원한다고 생각하지 않습니다. OAuth 2.0에 서명이 필요하지 않은 이유를 직접 경험하고 있습니다. –

+0

2 피트가되어야한다고 생각합니다. 단지 초보자이긴하지만 확실하지 않습니다. 다음은 흐름입니다. 사용자를 consumer_key, oauth_signatuer와 같은 매개 변수를 사용하여 URL로 리디렉션해야합니다. 그런 다음 사용자가 웹 페이지로 리디렉션해야 사용자가 기밀 정보를 입력 할 수 있습니다. 브라우저는 요청 토큰과 비밀을 가진 URL을 반환 할 것입니다 ..... 나는 그것을 위해 Scribe를 사용합니까? –

0

이 api는 예상되는 기본 문자열을 반환합니다. 다음과 같이 디버그 모드로 스크라이브를 실행하고 생성하는 기본 문자열을 볼 수 있습니다.

OAuthService serv = new ServiceBuilder().provider(KhanApi.class) 
.apiKey("***").apiSecret("***") 
.debug() 
.build(); 
+0

응답 해 주셔서 감사합니다. 디버그 모드를 사용하여 예상 기본 문자열을 보거나 인쇄하는 방법이 있습니까? –

+0

예,'debug'를 사용하십시오. –