【问题标题】:Can't understand OAuth flow for this API无法理解此 API 的 OAuth 流程
【发布时间】:2019-11-20 14:10:23
【问题描述】:

谁能帮助我了解可汗学院 API 的 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...

以下是我尝试过但效果不佳的两种不同的方法及其结果:

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

我使用相同的基本字符串来生成签名,并且我使用消费者密钥作为 HMAC-SHA1 方法的密钥。

以下是 KhanAPI 的外观: 导入 org.scribe.builder.api.DefaultApi10a; 导入 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";
}

}

谁能帮帮我? 谢谢,

【问题讨论】:

    标签: android oauth scribe khan-academy


    【解决方案1】:

    Scribe 不会添加所有必需的 OAuth 参数并为您执行签名吗?我正在查看基于默认 OAuth 1.0a 流程的 LinkedIn 示例,但我没有看到它做类似的事情。

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

    如果您必须手动制定 URL 并自己签名,那么 Scribe 到底在为您做什么?

    【讨论】:

    • 感谢您的回复。是的,你是对的,我也试过抄写员。问题是 API 提供者没有提供实现 API 类所需的任何 authenticationURL。能否请您看一下他们 API 的誓言流程,让我知道您的理解是什么?
    • 你是说你的 API 提供者只支持 2-legged oauth 吗?如果是这样,我认为 Scribe 不支持(很容易)。您正在亲身体验为什么 OAuth 2.0 不需要签名......正确的做法很痛苦。
    • 我猜应该是两条腿的,虽然我只是一个初学者,但我不确定。流程如下:您需要将用户重定向到带有诸如 consumer_key、oauth_signatuer 等参数的 URL,然后它应该将用户重定向到一个网页,然后用户可以输入他/她的机密信息。然后浏览器将返回一个带有请求令牌和秘密的 url ......这是我使用 Scribe 的东西吗?
    • 您是否在使用 Scribe?您似乎正在使用某些 OAuth API 中的一些类,但您也说您正在手动对其进行签名。要么使用 Scribe 并让它为您添加参数,要么手动构建和发送请求(例如使用 apache http 客户端)。很可能发送的任何内容实际上都是 Scribe 添加的参数和您自己的参数的混合,这肯定会导致错误的签名。
    • 我所描述的内容来自他们的 OAuth API 文档。实际上我试图自己发送参数但我失败了。现在我假设 Scribe 正在为我做这件事,尽管我不确定 Scribe 发送的值是什么,它们是否与这个 API 所期望的不同......当我使用 Scribe 时,我收到一个我猜想的 html 代码不是正确的响应,因为我看不到图像,链接也不起作用。假设在成功登录后,我应该能够为我没有收到任何参数的进一步进程获取请求令牌......
    【解决方案2】:

    这个 api 返回一个预期的基本字符串,这很棒。您可以在调试模式下运行 scribe 并查看正在生成的基本字符串,如下所示:

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

    【讨论】:

    • 感谢您的回复。我是使用调试模式来查看预期的基本字符串还是有办法打印出来?
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多