0

Khan AcademyAPIのOAuthフローを理解するのを手伝ってくれる人はいますか?次のリンクからアクセスできます: https ://github.com/Khan/khan-api/wiki/Khan-Academy-API-Authentication

私は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で応答します...

これが私が試したがうまくいかなかった2つの異なることとその結果です:

1)

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

結果は:

スレッド"main"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

同じ基本文字列を使用して署名を生成し、HMAC-SHA1メソッドのキーとしてコンシューマーキーを使用しています。

KhanAPIは次のようになります。importorg.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";
}

}

誰か助けてもらえますか?ありがとう、

4

2 に答える 2

1

Scribeは必要なすべてのOAuthパラメーターを追加して、署名を実行しませんか?デフォルトのOAuth1.0aフローに基づいたLinkedInの例を見ていますが、そのようなことはしていません。

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

URLを手動で作成して自分で署名する必要がある場合、Scribeは正確に何をしてくれますか?

于 2012-07-05T22:29:18.533 に答える
0

このAPIは、期待されるベース文字列を返します。これはすばらしいことです。次のように、デバッグモードでscribeを実行して、生成しているベース文字列を確認できます。

 OAuthService serv = new ServiceBuilder().provider(KhanApi.class)
 .apiKey("***").apiSecret("***")
 .debug()
 .build();
于 2012-07-06T15:02:02.487 に答える