任何人都可以幫助我瞭解可汗學院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";
}
}
誰能幫助我? 謝謝,
感謝您的回覆。是的,你是對的,我也試過抄寫員。問題是API提供程序沒有提供實現API類所需的任何authenticationURL。你可以看看他們的API宣誓流程,讓我知道你的理解是什麼? – 2012-07-05 22:35:19
你是說你的API提供者只支持雙腿oauth嗎?如果是這樣,我不認爲Scribe支持(容易)。您正在經歷爲什麼OAuth 2.0不需要簽名......這是一個很好的選擇。 – 2012-07-05 22:37:53
我想它應該是一個2腿,我不知道,雖然我只是一個初學者。以下是流程:您需要將用戶重定向到具有諸如consumer_key,oauth_signatuer等參數的URL,然後它應該將用戶重定向到網頁,然後用戶可以輸入他/她的機密信息。那麼瀏覽器將返回一個包含請求令牌和祕密的URL ......是我爲此使用Scribe的東西嗎? – 2012-07-06 01:22:49