0

ScribeJava OAuth メカニズムを使用して Khan Academy にアクセスしようとしています。トークンを正常に取得した後、401 の例外が発生します。これは、不正アクセスについて非常に明確です。そして、URLを次のものに変更すると

http://api-explorer.khanacademy.org/api/v1/user/videos/cGg1j1ZCCOs?userId=vilething&username=&email=

それは私に応答を与えます。ただし、ユーザー関連の情報はすべて空です。

public abstract class KhanAcademyAccess {

    private final static String USER_AGENT = "Mozilla/5.0";

    public static void main(String... args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, IOException, Exception {
        String videoId = "C38B33ZywWs";
        String username = "###";
        String password = "###";
        final OAuth10aService service = new ServiceBuilder()
                .apiKey("###")
                .apiSecret("###")
                .build(KAApi.instance());

        //Get Request Token
        final OAuth1RequestToken requestToken = service.getRequestToken();

        System.out.println(requestToken.getToken());
        sendPost("https://www.khanacademy.org/api/auth2/authorize", username, password, requestToken.getToken().toString());
        final OAuth1AccessToken accessToken = service.getAccessToken(requestToken, "");
        System.out.println(accessToken);


        final OAuthRequest request = new OAuthRequest(Verb.GET, "https://www.khanacademy.org/api/internal/_mt/user/videos/cGg1j1ZCCOs/log_compatability?", service);

        service.signRequest(accessToken, request);
          request.addHeader("Accept", "application/json; charset=utf-8");
            request.addHeader("Content-Type", "application/json; charset=utf-8");
            request.addHeader("X-Requested-With", "XMLHttpRequest");
            request.addHeader("Accept-Encoding", "application/json");

         Response response = request.send();

        System.out.println(response.getCode());
        System.out.println(response.getMessage());
        System.out.println(response.getBody());
    }
private static void sendPost(String url, String username, String password, String oauthToken) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();
        // Comment out from here (Using /* and */)...
        // ...to here and the request will fail with "HttpResponseException: Moved Permanently"
        try {
            HttpPost httpPost = new HttpPost(url);
            String encoding = Base64Encoder.getInstance().encode(StringUtils.getBytes(username + ":" + password));

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("identifier", username));
            params.add(new BasicNameValuePair("password", password));
            params.add(new BasicNameValuePair("oauth_token", oauthToken));

            httpPost.setEntity(new UrlEncodedFormEntity(params));
            System.out.println("executing request " + httpPost.getURI());
            // Create a response handler
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            HttpResponse responseBody = httpclient.execute(httpPost);
            // Add your code here...
            int responseCode = responseBody.getStatusLine().getStatusCode();
            while(responseCode!=200 ){
                for(Header header : responseBody.getAllHeaders()){
                    if(header.getName().equalsIgnoreCase("Location")){
                        responseCode = getRequest(header.getValue());
                    }

                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // When HttpClient instance is no longer needed, shut down the connection 
            // manager to ensure immediate deallocation of all system resources
        }

    }

認証プロセスを自動化し、ユーザーがページにリダイレクトされて [同意する] ボタンをクリックしたくないため、ユーザー名とパスワード認証を使用しています。

問題を特定するために役立つ可能性のあるログを追加する

リクエストトークン:

OAuth1RequestToken{oauth_token=t0000005405940108, oauth_token_secret=NyGQchdSAj7AwukA, oauth_callback_confirmed=true}

アクセストークン:

OAuth1AccessToken{oauth_token=t0000005413417574, oauth_token_secret=UMAV7Y54suAVPcJZ}

4

1 に答える 1

0

OAuth の目的は、アプリケーションがユーザーのユーザー名とパスワードを知る必要がないようにすることです。Oauth1 では、ブラウザーのリダイレクトは標準的な手順です。多くのユーザーが Google と Facebook を使用してログインしている可能性があるため、ユーザーの資格情報を直接使用することはできません。

Java で Khan API を使用する方法の例については、この例の要点を参照してください。

于 2016-06-03T16:53:34.067 に答える