Проблема с доступом к задачам Google при входе клиента - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь написать приложение для Android для доступа к Google Tasks.Я решил использовать метод авторизации 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ошибка рукопожатия: ошибка библиотеки 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 Ответ

0 голосов
/ 03 июня 2011

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

Если вы хотите использовать ClientLogin с клиентской библиотекой API Google для 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 аутентифицируется на основе предоставленных значений и возвращает объект ответа, который можно добавить в заголовок HTTP для обеспечения аутентификации ClientLogin.

Android AccountManager

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

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

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

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

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

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

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

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

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

...