Uwierzytelnianie w przypadku oprogramowania GDK Glassware

Jeśli Twoja aplikacja GDK Glassware musi uwierzytelniać użytkowników w usłudze internetowej, GDK udostępnia interfejs API, który umożliwia użytkownikom wpisanie danych logowania podczas instalowania aplikacji.

Dzięki temu interfejsowi API możesz zapewnić użytkownikom Glass spójne wrażenia i uniknąć konieczności wdrażania własnych schematów uwierzytelniania.

Tworzę konto usługi interfejsów API Google

Gdy uwierzytelnianie jest prawidłowo skonfigurowane, backend aplikacji internetowej używa interfejsu Mirror API do przesyłania informacji o koncie użytkownika do Glass po jego uwierzytelnieniu w usłudze.

Aby uzyskać dostęp do tego interfejsu API, utwórz projekt interfejsu API Google, a potem identyfikator klienta dla „konta usługi” (a nie „aplikacji internetowej”). Korzystając z konta usługi, użytkownicy nie muszą oddzielnie przyznawać aplikacji uprawnień do przekazywania swoich danych logowania do Glass. Nie zobaczą ponownie strony uprawnień OAuth ani Twojej strony uwierzytelniania.

Aby utworzyć to konto:

  1. Otwórz Google Developers Console.
  2. Kliknij przycisk Utwórz projekt i wpisz wymagane informacje.
  3. Gdy utworzysz projekt, zapisz numer projektu, który będzie potrzebny później.
  4. W sekcji Interfejsy API i autoryzacja kliknij Interfejsy API i włącz interfejs Google Mirror API w nowym projekcie.
  5. W sekcji Interfejsy API i autoryzacja kliknij kolejno Dane logowaniaUtwórz nowy identyfikator klienta. Zaznacz pole Konto usługi, aby utworzyć nowy identyfikator klienta OAuth 2.0 dla projektu.
  6. Pojawi się okno z informacją, że klucz prywatny jest pobierany na komputer, oraz z hasłem do tego klucza. Po zamknięciu tego okna nie będzie można pobrać klucza prywatnego ani wyświetlić hasła. Jeśli utracisz te dane, musisz utworzyć nowe.
  7. Zanotuj adres e-mail konta usługi, który będzie potrzebny później do wywołania interfejsu API.

Udostępnianie metadanych dotyczących Twoich aplikacji Glassware

Jeśli chcesz przesłać oprogramowanie Glassware, podaj te informacje. Dzięki temu możemy skonfigurować Twoje Glassware, aby było prawidłowo uwierzytelniane podczas implementacji.

  • URL uwierzytelniania, do którego użytkownicy są przekierowywani, gdy włączą aplikację Glassware w MyGlass.
  • typ konta (ciąg znaków, którego będziesz używać podczas wywoływania interfejsów API Androida AccountManager na urządzeniu Glass);
  • Nazwa pakietu aplikacji z urządzenia AndroidManifest.xml
  • Numeryczny identyfikator projektu interfejsu Google API utworzonego powyżej.
  • Plik APK do przesłania do MyGlass. Na potrzeby testowania wystarczy, że prześlesz ten plik APK tylko raz, aby umożliwić wstępne pobranie, gdy aplikacja na Google Glass zostanie włączona w aplikacji MyGlass. Następnie możesz iterować i debugować lokalnie, zastępując plik APK na urządzeniu. Pamiętaj, że ten plik APK musi spełniać te kryteria:
    • Musi być wyrównany do pliku ZIP.
    • Nie należy wprowadzać żadnych zmian w nazwie pakietu ani prywatnym kluczu podpisywania. Menedżer pakietów Androida nie zezwala na uaktualnienia, jeśli nastąpi którakolwiek z tych zmian.
    • Rozmiar pliku nie może przekraczać 50 MB.
    • Musi być skompilowana z użyciem najnowszej wersji GDK.

Implementacja procesu uwierzytelniania

Ten diagram przedstawia podstawowy proces uwierzytelniania w przypadku Glassware w GDK:

Aby wdrożyć proces uwierzytelniania:

  1. Gdy użytkownicy włączą Google Glass w MyGlass, zostaną przekierowani na Twój adres URL uwierzytelniania. Te żądania zawierają parametr zapytania o nazwie userToken, którego musisz użyć później.

  2. Użytkownik podaje swoje dane logowania na stronie uwierzytelniania.

  3. Serwer weryfikuje dane użytkownika. Jeśli dane logowania są prawidłowe, wywołaj interfejs Mirror API za pomocą metody mirror.accounts.insert. Ta metoda wymaga określenia zakresu https://www.googleapis.com/auth/glass.thirdpartyauth podczas tworzenia obiektu usługi lustrzanej. Przykłady wywołania tego interfejsu API za pomocą zwykłego protokołu HTTP lub języka Java znajdziesz w przykładach tworzenia konta.

    Parametry i treść żądania podane poniżej zawierają te same informacje, które podajesz w AccountManager Androida, jeśli tworzysz konto bezpośrednio na urządzeniu.

    Nazwa usługi Wartość Opis
    features[] lista ciągów tekstowych lista funkcji (AccountManager.hasFeatures);
    password ciąg znaków hasło do konta (patrz: AccountManager.getPassword). Zalecamy, aby nie przechowywać w tym polu rzeczywistego hasła użytkownika, a zamiast tego używać go do przechowywania długotrwałych danych prywatnych, takich jak token odświeżania.
    userData[] lista obiektów co najmniej 1 parę danych użytkownika powiązanych z kontem (patrz AccountManager.getUserData);
    userData[].key ciąg znaków Klucz powiązany z konkretną parą klucz-wartość danych użytkownika.
    userData[].value ciąg znaków Wartość powiązana z konkretną parą klucz-wartość danych użytkownika.
    authTokens[] lista obiektów Co najmniej 1 token uwierzytelniania powiązany z kontem (patrz AccountManager.getAuthToken).
    authTokens[].type ciąg znaków Typ tokena uwierzytelniania.
    authTokens[].authToken ciąg znaków Token uwierzytelniania.
  4. Po otrzymaniu żądania mirror.account.insert interfejs Mirror API przekazuje konto na urządzenia Google Glass użytkownika, gdzie możesz uzyskać do niego dostęp za pomocą klasy AccountManager.

Aby wdrożyć przyjazny dla użytkownika proces uwierzytelniania:

  • Zoptymalizuj proces aplikacji pod kątem urządzeń mobilnych.
  • Jeśli Twój proces ma zakres i użytkownik go anuluje, przygotuj dobrze zaprojektowany komunikat o błędzie.
  • Upewnij się, że żądane zakresy rzeczywiście są używane w oprogramowaniu Glassware.
  • Jeśli konto użytkownika można połączyć, upewnij się, że jest ono połączone.
  • W miarę możliwości dane użytkownika powinny być kopiowane do chmury.

Aby zachować spójność uwierzytelniania w Glassware, użyj jednej z tych ścieżek uwierzytelniania:

Lustrzane lub hybrydowe bez konta

  1. Po włączeniu w MyGlass adres URL uwierzytelniania otworzy się w wyskakującym okienku.
  2. Użytkownik zostanie bezpośrednio przekierowany do zakresów uprawnień do zaakceptowania.
  3. Gdy użytkownik zaakceptuje lub anuluje zakresy, zamknij wyskakujące okienko.

Odbicie lustrzane z kontem

  1. Po włączeniu tej opcji w MyGlass otworzy się wyskakujące okienko z adresem URL uwierzytelniania.
    • Jeśli użytkownik jest już zalogowany w Twojej usłudze, skieruj go bezpośrednio do zakresów.
    • Jeśli użytkownik nie jest zalogowany, pokaż pola logowania, pozwól mu zalogować się w usłudze, a potem prześlij go do zakresów.
    • Jeśli użytkownik nie ma konta, podaj mu link do jego utworzenia. Podczas instalacji użytkownicy muszą mieć możliwość utworzenia konta.
  2. Użytkownik akceptuje zakresy.
    • Jeśli aplikacja na Glass ma ustawienia, które można konfigurować, przekieruj użytkownika na stronę ustawień z odpowiednimi ustawieniami domyślnymi.
    • Jeśli aplikacja Glassware nie ma ustawień, które można konfigurować, przekieruj użytkownika na stronę potwierdzenia. Jeśli nie jest wymagana dodatkowa konfiguracja, zamknij wyskakujące okienko.

Hybrydowe z kontem

  1. Po włączeniu tej opcji w MyGlass otworzy się wyskakujące okienko z adresem URL uwierzytelniania.
    • Jeśli użytkownik jest już zalogowany w usłudze, przekieruj go bezpośrednio do zakresów.
    • Jeśli użytkownik nie jest zalogowany, pokaż pola logowania, pozwól mu się zalogować, a potem prześlij do zakresów.
    • Jeśli użytkownik nie ma konta, podaj mu link do jego utworzenia.
  2. Użytkownik akceptuje zakresy.
  3. Wyślij żądanie do interfejsu Mirror API, aby wstawić konto GDK.
    • Przekieruj użytkownika na stronę ustawień z wybranymi rozsądnymi ustawieniami domyślnymi.
    • Wyślij użytkownikowi stronę z potwierdzeniem. Zamknij wyskakujące okienko, jeśli nie musisz nic konfigurować.

Powiel lub hybrydowy widok z kontem i niestandardowymi zakresami

  1. Po włączeniu tej opcji w MyGlass otworzy się wyskakujące okienko z adresem URL uwierzytelniania.
    • Jeśli użytkownik jest już zalogowany w Twojej usłudze, wyślij go do zakresów wewnętrznych
    • Jeśli użytkownik nie jest zalogowany, wyświetl pola logowania, pozwól mu się zalogować, a następnie prześlij go do swoich zakresów wewnętrznych.
    • Jeśli użytkownik nie ma konta, podaj link do jego utworzenia.
  2. Gdy użytkownik zaakceptuje zakresy niestandardowe, przekieruj go do zakresów Google.
  3. Wyślij żądanie do interfejsu Mirror API, aby wstawić konto GDK.
    • Przekieruj użytkownika na stronę ustawień z wybranymi rozsądnymi ustawieniami domyślnymi.
    • Wyślij użytkownikowi stronę z potwierdzeniem. Jeśli nie jest wymagana żadna dodatkowa konfiguracja, zamknij wyskakujące okienko.

Lustrzane lub hybrydowe z aplikacją na Androida lub iPhone'a

  1. Po włączeniu w MyGlass adres URL uwierzytelniania otworzy się w wyskakującym okienku.
  2. Użytkownik zostanie bezpośrednio przekierowany do zakresów uprawnień do zaakceptowania.
  3. Gdy użytkownik zaakceptuje zakresy:
    • Jeśli użytkownik ma aplikację towarzyszącą i jest uwierzytelniony, zamknij wyskakujące okienko.
    • W przeciwnym razie przekieruj użytkownika do reklamy pośredniej, która kieruje do aplikacji w Sklepie Google Play lub sklepie iOS.
  4. Po zainstalowaniu aplikacji i uwierzytelnieniu zamknij wyskakujące okienko.

GDK i brak konta

W tym przypadku wystarczy włączyć Glassware w MyGlass.

GDK z kontem

  1. Po włączeniu tej opcji w MyGlass otworzy się wyskakujące okienko z adresem URL uwierzytelniania.
    • Jeśli użytkownik jest już zalogowany w Twojej usłudze, przekieruj go na ekran potwierdzenia.
    • Jeśli użytkownik nie jest zalogowany, wyświetl pola logowania, pozwól mu się zalogować, a potem prześlij go na ekran potwierdzenia.
    • Jeśli użytkownik nie ma konta, podaj mu link do jego utworzenia.
  2. Użytkownik akceptuje zakresy.
  3. Wyślij żądanie do interfejsu Mirror API, aby wstawić konto GDK.
  4. Pokaż ekran potwierdzenia, a potem zamknij go na krótki czas.

Przykłady tworzenia kont

W miarę możliwości używaj bibliotek klienta interfejsu Mirror API. Dzięki temu łatwiej będzie Ci zadzwonić do mirror.accounts.insert, aby utworzyć konto.

Przykład nieprzetworzonego żądania HTTP

Przykład poniżej zawiera tylko adres URL żądania i przykład treści JSON, których oczekuje. Wysyłanie żądań HTTP w postaci zwykłego tekstu w imieniu konta usługi jest znacznie bardziej skomplikowane (pełne informacje znajdziesz w artykule Używanie OAuth 2.0 w aplikacjach serwer-serwer), dlatego w celu ułatwienia tego procesu zalecamy użycie jednej z bibliotek klienta interfejsów API Google.

Metoda i adres URL żądania:

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

Treść żądania:

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

Zastąp wartość {userToken} w adresie URL żądania wartością tokena przekazanego do adresu URL uwierzytelniania w kroku 1 Implementowanie procesu uwierzytelniania.

Przykład w Javie

Ten przykład pokazuje, jak za pomocą biblioteki klienta Java wywołać funkcję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();
  }
}

Pobieranie kont na Glass

Pobieranie i używanie obiektów Account na Glass jest podobne do korzystania ze standardowego Androida AccountManager.

  1. Zadeklaruj te uprawnienia w pliku manifestu w pliku AndroidManifest.xml:

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
  2. Pobierz konta 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. Pobierz token uwierzytelniania ze strony 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);