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

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

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

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

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

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

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

  1. Перейдите в консоль разработчиков Google .
  2. Нажмите кнопку «Создать проект» и введите запрошенную информацию.
  3. После создания проекта запишите номер проекта , который понадобится вам позже.
  4. В разделе «API и аутентификация» нажмите «API» и включите API Google Mirror для своего нового проекта.
  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 должен соответствовать следующим критериям:
    • Он должен быть выровнен по молнии.
    • После этого вы не должны вносить никаких изменений в имя пакета или закрытый ключ подписи (менеджер пакетов 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 , Mirror API передает учетную запись на устройство(а) пользователя Glass, где теперь вы можете получить к ней доступ с помощью класса AccountManager .

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

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

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

Зеркало или гибрид без аккаунта

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

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

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

Гибрид с учетной записью

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

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

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

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

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

ГДК и нет аккаунта

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

ГДК с аккаунтом

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

Примеры создания аккаунта

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

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

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

Метод запроса и 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);