2012-07-05 81 views
0

任何人都可以幫助我瞭解可汗學院API的OAuth流程。 它可以通過此鏈接訪問: https://github.com/Khan/khan-api/wiki/Khan-Academy-API-Authentication無法理解此API的OAuth流程

我正在使用抄寫員。

這裏是工作代碼:

 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 

我使用的是相同的BA 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參數,併爲您執行簽名?我正在研究LinkedIn示例,該示例基於默認的OAuth 1.0a流程,並且我沒有看到它做這樣的事情。

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

如果你不得不手動制定URL和自己簽署

,究竟是抄寫員做的嗎?

+0

感謝您的回覆。是的,你是對的,我也試過抄寫員。問題是API提供程序沒有提供實現API類所需的任何authenticationURL。你可以看看他們的API宣誓流程,讓我知道你的理解是什麼? – 2012-07-05 22:35:19

+0

你是說你的API提供者只支持雙腿oauth嗎?如果是這樣,我不認爲Scribe支持(容易)。您正在經歷爲什麼OAuth 2.0不需要簽名......這是一個很好的選擇。 – 2012-07-05 22:37:53

+0

我想它應該是一個2腿,我不知道,雖然我只是一個初學者。以下是流程:您需要將用戶重定向到具有諸如consumer_key,oauth_signatuer等參數的URL,然後它應該將用戶重定向到網頁,然後用戶可以輸入他/她的機密信息。那麼瀏覽器將返回一個包含請求令牌和祕密的URL ......是我爲此使用Scribe的東西嗎? – 2012-07-06 01:22:49

0

這個api返回一個預期的基本字符串,這很好。您可以在調試模式下運行抄寫並查看您生成的基本字符串,如下所示:

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

感謝您的迴應。我是否使用調試模式查看預期的基本字符串還是有辦法將其打印出來? – 2012-07-06 18:11:28

+0

是的,使用'debug' – 2012-07-06 18:25:57