Проблема с доступом к Google tasks при входе в систему клиента

#android #httpurlconnection #task

#Android #httpurlconnection #задача

Вопрос:

Я пытаюсь написать приложение для Android для доступа к задачам Google. Я решил использовать метод авторизации ClientLogin.

Я получаю маркер ClientLogin «Auth» из первого запроса POST. Затем я пытаюсь получить списки задач пользователя с помощью запроса GET. Я написал следующий код для этого:

 String requestString = "https://www.googleapis.com/tasks/v1/users/@me/lists";
String resultString = "";
     try {
       URLConnection connection1 = null;
       URL url = new URL(requestString);
       connection1 = url.openConnection( );
       HttpURLConnection httpsConnection1 = (HttpURLConnection)connection1;
       httpsConnection1.setRequestMethod("GET");
       httpsConnection1.setRequestProperty("Authorization", "GoogleLogin auth=" authkeyString);
       httpsConnection1.setDoInput(true);
       httpsConnection1.connect();  
       int responseCode = httpsConnection1.getResponseCode();
       System.out.println(responseCode);
       if (responseCode == HttpsURLConnection.HTTP_OK) {
         InputStream in = httpsConnection1.getInputStream();
         InputStreamReader isr = new InputStreamReader(in, "UTF-8");
         StringBuffer data = new StringBuffer();
         int c;
         while ((c = isr.read()) != -1){
           data.append((char) c);
         }
         resultString = new String (data.toString());
       }
       else{
            resultString = "Errror - connection problem";
           }  
       }
       httpsConnection1.disconnect();
      }
      catch (MalformedURLException e) { 
                 resultString = "MalformedURLException1:"   e.getMessage();
        }
      catch (IOException e) { 
                resultString = "IOException1:"   e.getMessage();
       }
  

Вот «authkeyString» — строковая переменная с маркером авторизации.

Когда я запускаю приложение на реальном устройстве Android, я получаю: «IOException: сбой SSL handshake: сбой в библиотеке ssl, обычно ошибка протокола ….. «

Также я попытался запустить этот код из простого Java-приложения с рабочего стола:

 Exception in thread "main" java.lang.IllegalArgumentException: Illegal character(s) in message header value: GoogleLogin auth=DQ ..... UT

at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:428)
at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:394)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2378)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:296)
at Tasks.main(Tasks.java:81)
  

Комментарии:

1. Какое значение параметра serice вы использовали для авторизации для задач в методе входа в систему клиента?

Ответ №1:

ClientLogin с именем пользователя / паролем

Если вы хотите использовать ClientLogin с клиентской библиотекой Google APIs для Java, вам необходимо настроить HttpRequestFactory, который поддерживает аутентификацию.

 private static HttpTransport transport = new ApacheHttpTransport();

 public static HttpRequestFactory createRequestFactory(
   final HttpTransport transport) {

  return transport.createRequestFactory(new HttpRequestInitializer() {
   public void initialize(HttpRequest request) {
    GoogleHeaders headers = new GoogleHeaders();
    headers.setApplicationName("MyApp/1.0");
    request.headers=headers;
    try {
     authorizeTransport(request);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
});
  

Обратите внимание на метод authorizeTransport, который в основном разрешает запрос. authorizeTransport выглядит следующим образом:

 private void authorizeTransport(HttpRequest request) throws HttpResponseException, IOException {
    // authenticate with ClientLogin
    ClientLogin authenticator = new ClientLogin();
    authenticator.authTokenType = Constants.AUTH_TOKEN_TYPE;
    authenticator.username = Constants.USERNAME;
    authenticator.password = Constants.PASSWORD;
    authenticator.transport = transport;
    try {
     Response response = authenticator.authenticate();
     request.headers.authorization=response.getAuthorizationHeaderValue();
    } catch (HttpResponseException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }  
   }
  

В основном вы настраиваете метод аутентификации ClientLogin, предоставляя имя пользователя / пароль. Метод authenticate проверяет подлинность на основе предоставленных значений и возвращает объект response, который может быть добавлен в заголовок HTTP для обеспечения аутентификации ClientLogin.

Android AccountManager

Для интеграции с Android AccountManager (избегая ввода пользователем Android своего имени пользователя / пароля), вы можете найти некоторый пример кода здесьhttp://code.google.com/p/google-api-java-client/wiki/AndroidAccountManager

Тот факт, что пользователю не нужно вводить свое имя пользователя / пароли, повышает уровень комфорта пользователей, но решение остается относительно небезопасным.

Я бы настоятельно рекомендовал выполнить следующее :

Используйте клиентскую библиотеку

Я бы предложил перейти на клиентскую библиотеку Google APIs для Java для такого типа взаимодействия. Это клиентская библиотека Java, совместимая с Android, для всех видов API Google.

Вы не хотите беспокоиться о внедрении низкоуровневого протокола HTTP, безопасности и JSON.

В руководстве для разработчиков Google Task API также упоминается та же библиотека. Библиотека позаботится об аутентификации для вас. Если вы хотите использовать ClientLogin, все, что вам нужно будет сделать, это указать имя пользователя / пароль или интегрироваться с Android AccountManager.

Избегайте использования ClientLogin

ClientLogin считается небезопасным, и в отношении этого механизма аутентификации был обнаружен ряд дыр в безопасности. Google также не рекомендует это. Однако, если вы решите продолжить использовать ClientLogin, клиентская библиотека Google APIs для Java поддерживает ее.

Комментарии:

1. Спасибо! Я попытался написать тестовое приложение для Android с использованием клиентских библиотек — оно работает нормально. Но OAuth мне кажется не удобным. Я хотел бы использовать ClientLogin для начала работы с этими библиотеками. Знаете ли вы несколько примеров или что-то еще, показывающее использование ClientLogin вместе с клиентскими библиотеками? Я не нашел никакой информации для этого в руководстве разработчика задач.

2. Не беспокойтесь. Пожалуйста, примите ответ, если ответ окажется полезным