Аутентификация для стеклянной посуды GDK

Если вашему GDK Glassware необходимо аутентифицировать пользователей в веб-службе, GDK предоставляет API, который позволяет пользователю вводить свои учетные данные при установке вашего Glassware.

Используя этот API, вы обеспечиваете согласованный пользовательский интерфейс для пользователей Glass и избегаете накладных расходов на реализацию собственных пользовательских схем аутентификации.

Создание учетной записи службы Google API

Если проверка подлинности настроена правильно, серверная часть вашего веб-приложения использует API-интерфейс Mirror для отправки информации об учетной записи пользователя в Glass после того, как он пройдет проверку подлинности в вашей службе.

Чтобы получить доступ к этому API, создайте проект Google API, а затем создайте идентификатор клиента для «служебной учетной записи» (а не «веб-приложения»). Используя учетную запись службы, пользователям не нужно отдельно предоставлять вашему приложению разрешение на отправку своих учетных данных в Glass, и им не будет снова представлена ​​страница разрешений OAuth и ваша собственная страница аутентификации.

Чтобы создать эту учетную запись:

  1. Перейдите в консоль разработчиков Google .
  2. Нажмите кнопку «Создать проект» и введите запрошенную информацию.
  3. После создания проекта запишите номер проекта , который понадобится вам позже.
  4. В разделе APIs & auth щелкните APIs и включите Google Mirror API для своего нового проекта.
  5. В разделе «API и авторизация» нажмите «Учетные данные» , затем нажмите «Создать новый идентификатор клиента». Установите флажок Учетная запись службы , чтобы создать новый идентификатор клиента OAuth 2.0 для проекта.
  6. Всплывающее окно сообщит вам, что закрытый ключ загружается на ваш компьютер, и предоставит вам пароль для этого закрытого ключа. Как только вы закроете это окно, вы не сможете снова загрузить этот закрытый ключ или увидеть пароль. Если они когда-либо будут потеряны, вы должны создать новый.
  7. Запишите адрес электронной почты учетной записи службы, который понадобится вам позже, чтобы сделать вызов API.

Предоставление метаданных о вашей стеклянной посуде

Когда вы будете готовы отправить свою стеклянную посуду, вам нужно будет предоставить следующую информацию. Это позволяет нам правильно настроить проверку подлинности Glassware при его реализации.

  • Ваш URL-адрес для аутентификации , на который перенаправляются пользователи при включении Glassware в MyGlass.
  • Тип учетной записи (строка, которую вы будете использовать при вызове API-интерфейсов Android AccountManager на устройстве Glass).
  • Имя пакета вашего приложения из вашего AndroidManifest.xml
  • Числовой идентификатор проекта Google API для проекта, который вы создали выше.
  • APK для загрузки на MyGlass. Для тестирования вам нужно предоставить этот APK только один раз, чтобы выполнить первоначальную загрузку, когда ваша стеклянная посуда включена из MyGlass; после этого вы можете повторять и отлаживать локально, перезаписывая APK на своем устройстве. Обратите внимание, что этот APK должен соответствовать следующим критериям:
    • Он должен быть выровнен по zip-архиву.
    • После этого вы не должны вносить какие-либо изменения в имя пакета или закрытый ключ подписи (менеджер пакетов Android не разрешает обновления, если любое из этих изменений).
    • Он должен быть меньше 50 мегабайт.
    • Он должен быть скомпилирован с использованием последней версии GDK.

Реализация потока аутентификации

На следующей диаграмме показан основной поток аутентификации для GDK Glassware:

Чтобы реализовать поток аутентификации:

  1. Когда пользователи включают ваш Glassware в MyGlass, они перенаправляются на ваш URL-адрес для аутентификации. Эти запросы включают параметр запроса с именем userToken , который необходимо использовать позже.

  2. Пользователь вводит свои учетные данные на вашей странице аутентификации.

  3. Ваш сервер проверяет учетные данные пользователя. Если учетные данные действительны, выполните вызов Mirror API для метода mirror.accounts.insert . Этот метод требует, чтобы вы указали область https://www.googleapis.com/auth/glass.thirdpartyauth Thirdpartyauth при создании объекта службы «Зеркало». Примеры выполнения этого вызова API с использованием необработанного HTTP или Java показаны в примерах создания учетной записи .

    Параметры и тело запроса, которые вы предоставляете ниже, представляют ту же информацию, которую вы предоставили бы AccountManager Android, если бы вы создавали учетную запись непосредственно на устройстве.

    Имя свойства Ценить Описание
    features[] список строк Список функций (см. AccountManager.hasFeatures ).
    password нить Пароль учетной записи (см. AccountManager.getPassword ). Мы рекомендуем вам не хранить в этом поле фактический пароль пользователя, а вместо этого использовать его для хранения долгоживущих личных данных, таких как токен обновления.
    userData[] список объектов Одна или несколько пар пользовательских данных, связанных с учетной записью (см. AccountManager.getUserData ).
    userData[].key нить Ключ, связанный с определенной парой "ключ-значение" пользовательских данных.
    userData[].value нить Значение, связанное с определенной парой ключ-значение пользовательских данных.
    authTokens[] список объектов Один или несколько токенов авторизации, связанных с учетной записью (см. AccountManager.getAuthToken ).
    authTokens[].type нить Тип токена авторизации.
    authTokens[].authToken нить Токен авторизации.
  4. Получив запрос mirror.account.insert , API-интерфейс Mirror отправляет учетную запись на устройство(а) Glass пользователя, где теперь вы можете получить к ней доступ с помощью класса AccountManager .

Следуйте этим рекомендациям, чтобы реализовать удобный процесс аутентификации:

  • Оптимизируйте поток для мобильных устройств.
  • Если у вашего потока есть область действия, и пользователь отменит их, создайте хорошо продуманное сообщение об ошибке.
  • Убедитесь, что запрошенные области действительно используются в вашем Glassware.
  • Если учетную запись пользователя можно подключить, убедитесь, что вы подключили ее.
  • По возможности пользовательские данные должны сохраняться в облаке.

Чтобы обеспечить согласованность проверки подлинности Glassware, используйте один из следующих потоков проверки подлинности:

Зеркало или гибрид без учетной записи

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
  2. Это напрямую отправляет пользователя к областям для принятия.
  3. После того, как пользователь примет или отменит области действия, закройте всплывающее окно.

Зеркало с аккаунтом

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
    • Если пользователь уже вошел в вашу службу, отправьте пользователя непосредственно в области.
    • Если пользователь не вошел в систему, отобразите поля входа, разрешите им войти в вашу службу, а затем отправьте их в области.
    • Если у пользователя нет учетной записи, укажите ссылку для создания учетной записи. Пользователи должны иметь возможность создать учетную запись как часть процесса установки.
  2. Пользователь принимает области.
    • Если у вашего Glassware есть настраиваемые параметры, отправьте пользователя на страницу настроек с выбранными разумными значениями по умолчанию.
    • Если в вашем Glassware нет настраиваемых параметров, отправьте пользователя на страницу подтверждения. Закройте всплывающее окно, если дополнительная настройка не требуется.

Гибрид с аккаунтом

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
    • Если пользователь уже вошел в вашу службу, отправьте пользователя непосредственно в области.
    • Если пользователь не вошел в систему, отобразите поля входа, разрешите им войти, а затем отправьте их в области.
    • Если у пользователя нет учетной записи, укажите ссылку для создания учетной записи.
  2. Пользователь принимает области.
  3. Отправьте запрос API-интерфейсу зеркала для вставки учетной записи GDK.
    • Отправьте пользователя на страницу настроек с выбранными разумными значениями по умолчанию.
    • Отправьте пользователю страницу подтверждения. Закройте всплывающее окно, если дополнительная настройка не требуется.

Зеркальное или гибридное с учетной записью и настраиваемыми областями

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
    • Если пользователь уже вошел в вашу службу, отправьте пользователя во внутренние области.
    • Если пользователь не вошел в систему, отобразите поля входа, разрешите им войти, а затем отправьте их во внутренние области.
    • Если у пользователя нет учетной записи, укажите ссылку для создания учетной записи.
  2. Когда пользователь примет ваши настраиваемые области, отправьте пользователя в области Google.
  3. Отправьте запрос API-интерфейсу зеркала для вставки учетной записи GDK.
    • Отправьте пользователя на страницу настроек с выбранными разумными значениями по умолчанию.
    • Отправьте пользователю страницу подтверждения. Закройте всплывающее окно, если дополнительная настройка не требуется.

Зеркально или гибридно с приложением для Android/iPhone

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
  2. Это напрямую отправляет пользователя к областям для принятия.
  3. После того, как пользователь примет области действия:
    • Если у пользователя есть сопутствующее приложение и он прошел проверку подлинности, закройте всплывающее окно.
    • Если нет, отправьте пользователя на межстраничное объявление, которое направит его на загрузку приложения из магазина Google Play или магазина iOS.
  4. После установки приложения и авторизации закройте всплывающее окно.

GDK и без аккаунта

Включение Glassware в MyGlass — это все, что требуется для этого процесса.

ГДК с учетной записью

  1. После включения в MyGlass ваш URL-адрес для аутентификации открывается во всплывающем окне.
    • Если пользователь уже вошел в вашу службу, отправьте его на экран подтверждения.
    • Если пользователь не вошел в систему, отобразите поля входа, разрешите им войти, а затем отправьте их на экран подтверждения.
    • Если у пользователя нет учетной записи, укажите ссылку для создания учетной записи.
  2. Пользователь принимает области.
  3. Отправьте запрос API-интерфейсу зеркала для вставки учетной записи GDK.
  4. Покажите экран подтверждения и закройте экран после его отображения в течение короткого периода времени.

Примеры создания учетной записи

По возможности используйте клиентские библиотеки для Mirror API. Это упрощает вызов mirror.accounts.insert для создания учетной записи.

Необработанный пример HTTP

В приведенном ниже примере показан только URL-адрес запроса и пример ожидаемого тела JSON. Выполнение необработанных HTTP-запросов от имени служебной учетной записи намного сложнее (полную информацию см. в разделе Использование OAuth 2.0 для межсерверных приложений ), поэтому мы рекомендуем вам использовать одну из наших клиентских библиотек API Google, если это возможно, чтобы упростить эту задачу.

Метод запроса и URL:

POST https://www.googleapis.com/mirror/v1/accounts/{userToken}/com.example.myapp/username%40email.com

Тело запроса:

{
    "features": ["a", "b", "c"],
    "userData": [
        { "key": "realName", "value": "Rusty Shackleford" },
        { "key": "foo", "value": "bar" }
    ],
    "authTokens": [
        { "type": "your_token_type", "authToken": "zT419Ma3X2pBr0L..." }
    ]
}

Замените {userToken} в URL-адресе запроса токеном, который был передан на ваш URL-адрес проверки подлинности на шаге 1 раздела Реализация потока проверки подлинности .

Пример Java

В этом примере показано, как использовать клиентскую библиотеку Java для вызова mirror.accounts.insert

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.mirror.Mirror;
import com.google.api.services.mirror.model.Account;
import com.google.api.services.mirror.model.AuthToken;
import com.google.common.collect.Lists;
...

/** Email of the Service Account */
private static final String SERVICE_ACCOUNT_EMAIL =
    "<some-id>@developer.gserviceaccount.com";

/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH =
    "/path/to/<public_key_fingerprint>-privatekey.p12";

/** The account type, usually based on your company or app's package. */
private static final String ACCOUNT_TYPE = "com.example.myapp";

/** The Mirror API scopes needed to access the API. */
private static final String MIRROR_ACCOUNT_SCOPES =
    "https://www.googleapis.com/auth/glass.thirdpartyauth";

/**
 * Build and returns a Mirror service object authorized with the service accounts.
 *
 * @return Mirror service object that is ready to make requests.
 */
public static Mirror getMirrorService() throws GeneralSecurityException,
    IOException, URISyntaxException {
  HttpTransport httpTransport = new NetHttpTransport();
  JacksonFactory jsonFactory = new JacksonFactory();
  GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
      .setServiceAccountScopes(MIRROR_ACCOUNT_SCOPES)
      .setServiceAccountPrivateKeyFromP12File(
          new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
      .build();
  Mirror service = new Mirror.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential).build();
  return service;
}

/**
 * Creates an account and causes it to be synced up with the user's Glass.
 * This example only supports one auth token; modify it if you need to add
 * more than one, or to add features, user data, or the password field.
 *
 * @param mirror the service returned by getMirrorService()
 * @param userToken the user token sent to your auth callback URL
 * @param accountName the account name for this particular user
 * @param authTokenType the type of the auth token (chosen by you)
 * @param authToken the auth token
 */
public static void createAccount(Mirror mirror, String userToken, String accountName,
    String authTokenType, String authToken) {
  try {
    Account account = new Account();
    List<AuthToken> authTokens = Lists.newArrayList(
        new AuthToken().setType(authTokenType).setAuthToken(authToken));
    account.setAuthTokens(authTokens);
    mirror.accounts().insert(
        userToken, ACCOUNT_TYPE, accountName, account).execute();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

Получение учетных записей на Glass

Получение и использование объектов Account на Glass аналогично использованию стандартного Android AccountManager .

  1. Объявите следующие разрешения манифеста в файле AndroidManifest.xml :

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
  2. Получить учетные записи Glassware:

    AccountManager accountManager = AccountManager.get(mContext);
    // Use your Glassware's account type.
    Account[] accounts = accountManager.getAccountsByType("com.example");
    
    // Pick an account from the list of returned accounts.
    
  3. Получить токен авторизации из Account :

    // Your auth token type.
    final String AUTH_TOKEN_TYPE = "oauth2:https://www.example.com/auth/login";
    
    accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                // Use the token.
            } catch (Exception e) {
                // Handle exception.
            }
        }
    }, null);