2016-05-11 3 views
0

Я пытаюсь получить доступ к Академии Хан, используя механизм ScribeJava OAuth. После успешного получения маркера я получаю исключение 401. Это совершенно определенно о несанкционированном доступе. И если я изменить URL-адрес в одинOAuth в Java - ошибка OAuth. Потребительский доступ отрицается

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 = истина}

Токен доступа:

OAuth1AccessToken {oauth_token = t0000005413417574, oauth_token_secret = UMAV7Y54suAVPcJZ}

ответ

0

Цель OAuth, чтобы избежать приложения необходимости знать имя пользователя и пароль пользователя. С Oauth1 переадресация браузера является стандартной процедурой. Многие из ваших пользователей также могут использовать Google и Facebook для входа в систему, поэтому вы не сможете напрямую использовать свои учетные данные.

Для примера использования API-интерфейса Khan с java см. this example gist

Смежные вопросы