Статьи

Google ClientLogin Утилита в Java

Аутентификация и авторизация для API Google — распространенная функция в современных приложениях, требующая интеграции и обмена информацией со службами Google. Хотя большая часть этого процесса аутентификации Google предназначена для веб-приложений, она также доступна для настольных и установленных приложений. Для настольных приложений Google рекомендует использовать метод аутентификации ClientLogin .

Стоит отметить, что ClientLogin предназначен для использования, когда существует высокий уровень доверия между приложением и владельцем защищенных данных. Обычно это рекомендуется для случаев, когда приложение владеет защищенными данными.

Метод ClientLogin работает, главным образом, путем отправки запросов HTTP Post в службу Google с использованием определенных параметров, как описано в документации Google . В этой статье мы будем использовать другой подход для реализации процесса авторизации ClientLogin. Мы будем использовать Клиентскую библиотеку API Google для Java , которая является мощной библиотекой Java для доступа к API Google на основе HTTP в Интернете. Очевидно, что наиболее важным классом в этой библиотеке является класс ClientLogin .

1-Анатомия класса ClientLogin:

Класс ClientLogin предоставляет единственный метод authenticate (), который обрабатывает детали процесса аутентификации. он также предоставляет важный внутренний класс ErrorInfo, который может использоваться для обработки ошибок аутентификации и логики запроса капчи.

В этом посте мы представляем чистый класс-оболочку для ClientLogin, который обрабатывает полный процесс авторизации ClientLogin, включая анализ ошибок аутентификации и обработку контрольных вызовов.

2-google-api-java-client Зависимости Maven:

Мы выбрали maven для построения нашего примера проекта. Maven предоставляет зависимости для клиентской библиотеки API Google для Java. просто добавьте следующие зависимости maven в ваш файл pom.xml:

01
02
03
04
05
06
07
08
09
10
<dependency>
    <groupId>com.google.api.client</groupId>
    <artifactId>google-api-client-googleapis-auth-clientlogin</artifactId>
    <version>1.2.3-alpha</version>
</dependency>
<dependency>
    <groupId>com.google.api.client</groupId>
    <artifactId>google-api-client-javanet</artifactId>
    <version>1.2.3-alpha</version>
</dependency>

После этого используйте maven: install для установки необходимых jar-файлов, которые будут включены в наш путь к классам проекта.

3-GoogleClientLogin класс оболочки:

Наш класс-оболочка, очевидно, содержит ссылку на ClientLogin. Он предоставляет публичные методы, реализующие важные функции процесса аутентификации.

GoogleClientLogin имеет конструктор, который принимает строку, представляющую сервис Google, для которого вы запрашиваете авторизацию (например, «cl» для Календаря Google). Конструктор выглядит так:

01
02
03
04
05
06
07
08
09
10
/**
* @param service
*/
public GoogleClientLogin(String service) {
    super();
    this.service = service;
    authenticator = new ClientLogin();
    transport = GoogleTransport.create();
    authenticator.authTokenType = service;
}

Основным методом является authenticate (имя пользователя, пароль), который принимает два аргумента, представляющих имя пользователя и пароль, введенные пользователем:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* @param username
* @param password
* @throws ClientLoginException
*/
public void authenticate(String username, String password)
        throws ClientLoginException {
 
    try {
 
        // authenticate with ClientLogin
        authenticator.username = username;
        authenticator.password = password;
        Response response = authenticator.authenticate();
        this.authToken = response.auth;
 
    } catch (HttpResponseException e) {
        parseError(e);
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
}

Этот метод устанавливает переменные ClientLogin (имя пользователя и пароль), затем вызывает ClientLogin.authenticate (), который возвращает экземпляр Response. если вызов ClientLogin.authenticate () выполнен успешно, мы сохраняем токен аутентификации Response.auth. Преимущество метода-оболочки authenticate (username, password) заключается в его интеллектуальной обработке ошибок аутентификации.

Разбор ошибок аутентификации:

Мы различаем две категории ошибок, которые могут быть выброшены во время вызова Clientlogin.authenticate ():

a-неисправимые ошибки, для которых мы используем класс ClientLoginException
ба исправляемая ошибка, возникающая, когда сервис Google требует проверки с помощью капчи.

Для этого позже мы используем отдельный класс Exception CaptchaRequiredException, который расширяет первый класс ClientLoginException.

Clientlogin.authenticate () создает исключение HttpResponseException, если в ответе проверки подлинности содержится код ошибки. мы предоставляем вспомогательный метод для анализа этого класса исключений следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * @param e
 * @throws ClientLoginException
 */
private void parseError(HttpResponseException e)
        throws ClientLoginException {
    try {
 
        ClientLogin.ErrorInfo errorInfo = e.response.parseAs(ClientLogin.ErrorInfo.class);
        errorMessage = errorMsg.get(errorInfo.error);
        if (errorInfo.error.equals(CaptchaRequired)) {
            captchaToken = errorInfo.captchaToken;
            captchaUrl = errorInfo.captchaUrl;
            throw new CaptchaRequiredException(errorMessage, e);
 
        } else
            throw new ClientLoginException(errorMessage, e);
    } catch (IOException e1) {
 
        throw new ClientLoginException(e1);
    }
}

Мы вызываем HttpResponseException.response.parseAs (ClientLogin.ErrorInfo.class) для анализа ответа. Если код ошибки «CaptchaRequired», мы сохраняем errorInfo.captchaToken и errorInfo.captchaUrl, а затем генерируем CaptchaRequiredException. Для остальных кодов ошибок мы просто выкидываем ClientLoginException.

Аутентификация с помощью CAPTCHA Challenge

В случае вызова CAPTCHA мы предоставляем второй метод authenticate (), который предоставляет дополнительный аргумент «captchaAnswer», представляющий ключ капчи, введенный пользователем во время вызова CAPTCHA:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * @param username
 * @param password
 * @param captchaAnswer
 * @throws ClientLoginException
 */
public void authenticate(String username, String password,
        String captchaAnswer) throws ClientLoginException {
    authenticator.username = username;
    authenticator.password = password;
    authenticator.captchaToken = this.captchaToken;
    authenticator.captchaAnswer = captchaAnswer;
    try {
        Response response = authenticator.authenticate();
        this.authToken = response.auth;
    } catch (HttpResponseException e) {
        parseError(e);
    } catch (IOException e) {
        throw new ClientLoginException(e);
    }
}

Перед вызовом authenticator.authenticate () этот метод устанавливает два дополнительных поля authenticator.captchaToken и authenticator.captchaAnswer. Обработка ошибок для этого метода аналогична основному методу аутентификации (имя пользователя, пароль).

Наконец, мы предоставляем метод для получения изображения CAPTCHA, которое будет отображаться пользователю:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * @return the captchaImage
 */
public BufferedImage getCaptchaImage() {
 
    BufferedImage image = null;
    try {
        URL url = new URL("https://www.google.com/accounts/"+ getCaptchaUrl());
        image = ImageIO.read(url);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
 
    return image;
}

Вы можете просмотреть полный исходный файл класса GoogleClientLogin здесь .

4-тестирование класса оболочки GoogleClient

GoogleClientLoginDialog — это свинг-диалог, в котором представлен пример использования класса- оболочки GoogleClientLogin . Он предоставляет возможность заставить службу Google отправлять вызов CAPTCHA. мы реализуем этот тест, используя поток, который продолжает посылать случайные пароли, пока Google не ответит на запрос CAPTCHA:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private class ForceCaptchaRunnable implements Runnable{
 
    public void run() {
        Random r = new Random();
        boolean isCaptcha = false;
        while (!isCaptcha) {
            try {
                client.authenticate(textField.getText().trim(),
                        passwordField.getText().trim()+ r.nextInt(100));
                showMessage("Auth Token: "+client.getAuthToken());
            } catch (CaptchaRequiredException e1) {
 
                isCaptcha = true;
                showCaptcha(true);
 
            } catch (ClientLoginException e1) {
 
            }
        }
 
    }
 
}

Вы можете просмотреть и загрузить полный исходный код этого примера проекта Google code project: google-apis-utils .

Ссылка: Google ClientLogin Utility на Java от нашего партнера JCG Отмана Эль Мулата в блоге Отмана .

Статьи по Теме :