Authentifizierung für GDK-Glassware

Wenn Ihre GDK-GDK-Glassware Nutzer bei einem Webdienst authentifizieren muss, stellt das GDK eine API zur Verfügung, über die der Nutzer bei der Installation Ihrer Glassware seine Anmeldedaten eingeben kann.

Wenn Sie diese API verwenden, bieten Sie Glass-Nutzern eine einheitliche Benutzeroberfläche und vermeiden den Aufwand, eigene benutzerdefinierte Authentifizierungsschemata zu implementieren.

Google API-Dienstkonto erstellen

Wenn die Authentifizierung richtig eingerichtet ist, verwendet das Back-End Ihrer Webanwendung die Mirror API, um die Kontoinformationen der Nutzer an Glass zu senden, nachdem sie sich bei Ihrem Dienst authentifiziert haben.

Wenn Sie auf diese API zugreifen möchten, erstellen Sie ein Google API-Projekt und dann eine Client-ID für ein „Dienstkonto“ (nicht für eine „Webanwendung“). Wenn Sie ein Dienstkonto verwenden, müssen Nutzer Ihrer Anwendung nicht separat die Berechtigung erteilen, ihre Anmeldedaten an Glass zu senden. Außerdem werden ihnen nicht noch einmal die OAuth-Berechtigungsseite und Ihre eigene Authentifizierungsseite angezeigt.

So erstellst du dieses Konto:

  1. Rufen Sie die Google Developers Console auf.
  2. Klicken Sie auf die Schaltfläche Projekt erstellen und geben Sie die erforderlichen Informationen ein.
  3. Notieren Sie sich nach dem Erstellen des Projekts die Projektnummer, die Sie später benötigen.
  4. Klicken Sie unter APIs und Authentifizierung auf APIs und aktivieren Sie die Google Mirror API für Ihr neues Projekt.
  5. Klicken Sie unter APIs und Authentifizierung auf Anmeldedaten und dann auf Neue Client-ID erstellen. Setzen Sie ein Häkchen in das Kästchen Dienstkonto, um eine neue OAuth 2.0-Client-ID für das Projekt zu erstellen.
  6. In einem Pop-up-Fenster werden Sie darüber informiert, dass der private Schlüssel auf Ihren Computer heruntergeladen wird. Außerdem wird Ihnen das Passwort für diesen privaten Schlüssel angezeigt. Wenn Sie dieses Fenster schließen, können Sie diesen privaten Schlüssel nicht mehr herunterladen und das Passwort nicht mehr sehen. Falls sie verloren gehen sollten, müssen Sie eine neue erstellen.
  7. Notieren Sie sich die E-Mail-Adresse des Dienstkontos. Diese benötigen Sie später für den API-Aufruf.

Metadaten zu Ihren Glaswaren bereitstellen

Wenn Sie bereit sind, Ihre Glassware einzureichen, benötigen Sie die folgenden Informationen. So können wir Ihre Glassware so einrichten, dass sie bei der Implementierung korrekt authentifiziert wird.

  • Ihre Authentifizierungs-URL, zu der Nutzer weitergeleitet werden, wenn sie Ihre Glassware in MyGlass aktivieren.
  • Kontotyp (String, den Sie verwenden, wenn Sie die Android AccountManager APIs auf dem Glass-Gerät aufrufen)
  • Der Paketname Ihrer Anwendung aus Ihrer AndroidManifest.xml
  • Die numerische Google API-Projekt-ID des Projekts, das Sie oben erstellt haben
  • Das APK, das in MyGlass hochgeladen werden soll. Für den Test müssen Sie dieses APK nur einmal angeben, um den ersten Download zu verarbeiten, wenn Ihre Glassware über MyGlass aktiviert ist. Danach können Sie lokal iterieren und Fehler beheben, indem Sie das APK auf Ihrem Gerät überschreiben. Dieses APK muss die folgenden Kriterien erfüllen:
    • Es muss zip-ausgerichtet sein.
    • Danach dürfen Sie am Paketnamen oder privaten Signaturschlüssel keine Änderungen mehr vornehmen. Der Android-Paketmanager lässt keine Upgrades zu, wenn eine dieser Änderungen vorgenommen wird.
    • Sie muss kleiner als 50 MB sein.
    • Sie muss mit der neuesten Version der GDK kompiliert werden.

Authentifizierungsablauf implementieren

Das folgende Diagramm zeigt den grundlegenden Authentifizierungsablauf für GDK Glassware:

So implementierst du den Authentifizierungsablauf:

  1. Wenn Nutzer Ihre Glassware in MyGlass aktivieren, werden sie zu Ihrer Authentifizierungs-URL weitergeleitet. Diese Anfragen enthalten einen Abfrageparameter namens userToken, den Sie später verwenden müssen.

  2. Der Nutzer gibt seine Anmeldedaten auf Ihrer Authentifizierungsseite ein.

  3. Ihr Server validiert die Anmeldedaten des Nutzers. Wenn die Anmeldedaten gültig sind, führe einen Mirror API-Aufruf an die mirror.accounts.insert-Methode aus. Bei dieser Methode müssen Sie den https://www.googleapis.com/auth/glass.thirdpartyauth-Bereich angeben, wenn Sie das Spiegeldienstobjekt erstellen. Beispiele für diesen API-Aufruf mithilfe von Roh-HTTP oder Java finden Sie in den Beispielen für die Kontoerstellung.

    Die unten angegebenen Parameter und der Anfragetext entsprechen den Informationen, die Sie der AccountManager von Android zur Verfügung stellen würden, wenn Sie das Konto direkt auf dem Gerät erstellen würden.

    Property-Name Wert Beschreibung
    features[] Liste mit Strings Eine Liste der Funktionen (siehe AccountManager.hasFeatures).
    password String Das Kontopasswort (siehe AccountManager.getPassword). Wir empfehlen, das tatsächliche Passwort des Nutzers nicht in diesem Feld zu speichern, sondern stattdessen langfristige private Daten wie ein Aktualisierungstoken.
    userData[] Liste der Objekte Ein oder mehrere Paare von Nutzerdaten, die mit dem Konto verknüpft sind (siehe AccountManager.getUserData).
    userData[].key String Der Schlüssel, der mit einem bestimmten Schlüssel/Wert-Paar für Nutzerdaten verknüpft ist.
    userData[].value String Der Wert, der mit einem bestimmten Schlüssel/Wert-Paar für Nutzerdaten verknüpft ist.
    authTokens[] Liste der Objekte Ein oder mehrere Auth-Token, die mit dem Konto verknüpft sind (siehe AccountManager.getAuthToken).
    authTokens[].type String Der Typ des Authentifizierungstokens.
    authTokens[].authToken String Das Authentifizierungstoken.
  4. Nach dem Empfang der Anfrage mirror.account.insert überträgt die Mirror API das Konto auf die Glass-Geräte des Nutzers. Von dort aus können Sie dann mithilfe der Klasse AccountManager darauf zugreifen.

Beachte die folgenden Richtlinien, um einen nutzerfreundlichen Authentifizierungsvorgang zu implementieren:

  • Optimieren Sie den Ablauf für Mobilgeräte.
  • Wenn Ihr Ablauf einen Bereich hat und der Nutzer ihn abbricht, sollten Sie eine gut gestaltete Fehlermeldung verwenden.
  • Achten Sie darauf, dass die angeforderten Bereiche tatsächlich in Ihrer Glassware verwendet werden.
  • Wenn ein Nutzerkonto verbunden werden kann, müssen Sie dies tun.
  • Nutzerdaten sollten nach Möglichkeit in der Cloud gesichert werden.

Verwenden Sie einen der folgenden Authentifizierungsabläufe, um für Einheitlichkeit bei der Glassware-Authentifizierung zu sorgen:

Spiegeln oder hybride Arbeitsmodelle ohne Konto

  1. Nachdem Sie die Funktion in MyGlass aktiviert haben, wird Ihre Authentifizierungs-URL in einem Pop-up geöffnet.
  2. Dadurch wird der Nutzer direkt zu den Bereichen weitergeleitet, die er akzeptieren muss.
  3. Schließen Sie das Pop-up, nachdem der Nutzer die Berechtigungen akzeptiert oder abgebrochen hat.

Mit einem Konto spiegeln

  1. Nach dem Aktivieren in MyGlass wird Ihre Authentifizierungs-URL in einem Pop-up-Fenster geöffnet.
    • Wenn der Nutzer bereits in Ihrem Dienst angemeldet ist, leiten Sie ihn direkt zu den Bereichen weiter.
    • Wenn der Nutzer nicht angemeldet ist, zeigen Sie die Anmeldefelder an, erlauben Sie ihm, sich in Ihrem Dienst anzumelden, und leiten Sie ihn dann zu den Bereichen weiter.
    • Wenn der Nutzer kein Konto hat, geben Sie einen Link zum Erstellen eines Kontos an. Nutzer müssen im Rahmen des Installationsvorgangs ein Konto erstellen können.
  2. Der Nutzer akzeptiert die Bereiche.
    • Wenn Ihre Glassware konfigurierbare Einstellungen hat, leiten Sie den Nutzer zur Seite mit den Einstellungen weiter, wobei angemessene Standardeinstellungen ausgewählt sind.
    • Wenn Ihre Glassware keine konfigurierbaren Einstellungen hat, leiten Sie den Nutzer zu einer Bestätigungsseite weiter. Schließen Sie das Pop-up, wenn keine weitere Konfiguration erforderlich ist.

Hybrid mit Konto

  1. Nachdem Sie die Funktion in MyGlass aktiviert haben, wird Ihre Authentifizierungs-URL in einem Pop-up geöffnet.
    • Wenn der Nutzer bereits in Ihrem Dienst angemeldet ist, leiten Sie ihn direkt zu den Bereichen weiter.
    • Wenn der Nutzer nicht angemeldet ist, zeigen Sie die Anmeldefelder an, lassen Sie die Anmeldung zu und senden Sie sie dann an Bereiche.
    • Wenn der Nutzer kein Konto hat, geben Sie einen Link zum Erstellen eines Kontos an.
  2. Der Nutzer akzeptiert die Bereiche.
  3. Senden Sie eine Anfrage an die Mirror API, um das GDK-Konto einzufügen.
    • Leiten Sie den Nutzer zur Seite „Einstellungen“ weiter, auf der angemessene Standardeinstellungen ausgewählt sind.
    • Senden Sie dem Nutzer eine Bestätigungsseite. Schließen Sie das Pop-up, wenn keine weitere Konfiguration erforderlich ist.

Spiegelung oder Hybrid mit einem Konto und benutzerdefinierten Bereichen

  1. Nach dem Aktivieren in MyGlass wird Ihre Authentifizierungs-URL in einem Pop-up-Fenster geöffnet.
    • Wenn der Nutzer bereits in Ihrem Dienst angemeldet ist, leiten Sie ihn an Ihre internen Bereiche weiter.
    • Wenn der Nutzer nicht angemeldet ist, zeigen Sie die Anmeldefelder an, erlauben Sie ihm die Anmeldung und senden Sie ihn dann an Ihre internen Bereiche
    • Wenn der Nutzer kein Konto hat, geben Sie einen Link zum Erstellen eines Kontos an.
  2. Wenn der Nutzer Ihre benutzerdefinierten Bereiche akzeptiert, leiten Sie ihn zu den Bereichen von Google weiter.
  3. Senden Sie eine Anfrage an die Mirror API, um das GDK-Konto einzufügen.
    • Leiten Sie den Nutzer zur Seite „Einstellungen“ weiter, auf der angemessene Standardeinstellungen ausgewählt sind.
    • Senden Sie dem Nutzer eine Bestätigungsseite. Schließen Sie das Pop-up, wenn keine weitere Konfiguration erforderlich ist.

Spiegelung oder Hybridmodus mit einer Android-/iPhone-App

  1. Nachdem Sie die Funktion in MyGlass aktiviert haben, wird Ihre Authentifizierungs-URL in einem Pop-up geöffnet.
  2. Dadurch wird der Nutzer direkt zu den Bereichen weitergeleitet, auf denen er akzeptiert werden kann.
  3. Nachdem der Nutzer die Berechtigungen akzeptiert hat:
    • Wenn der Nutzer die Companion-App hat und authentifiziert ist, schließe das Pop-up-Fenster.
    • Andernfalls leiten Sie den Nutzer zu einem Interstitial weiter, über das er die App im Google Play Store oder im iOS-Shop herunterladen kann.
  4. Nach der Installation der App und der Authentifizierung das Pop-up-Fenster schließen

GDK und kein Konto

Für diesen Ablauf ist es nur erforderlich, die Glassware in MyGlass zu aktivieren.

GDK mit Konto

  1. Nachdem Sie die Funktion in MyGlass aktiviert haben, wird Ihre Authentifizierungs-URL in einem Pop-up geöffnet.
    • Wenn der Nutzer bereits in Ihrem Dienst angemeldet ist, leiten Sie ihn zum Bestätigungsbildschirm weiter.
    • Wenn der Nutzer nicht angemeldet ist, zeigen Sie die Anmeldefelder an, erlauben Sie ihm, sich anzumelden, und leiten Sie ihn dann zum Bestätigungsbildschirm weiter.
    • Wenn der Nutzer kein Konto hat, geben Sie einen Link zum Erstellen eines Kontos an.
  2. Der Nutzer akzeptiert die Bereiche.
  3. Senden Sie eine Anfrage an die Mirror API, um das GDK-Konto einzufügen.
  4. Blende den Bestätigungsbildschirm ein und schließe den Bildschirm, nachdem er eine kurze Zeit lang angezeigt wurde.

Beispiele für die Kontoerstellung

Verwenden Sie nach Möglichkeit die Clientbibliotheken für die Mirror API. So können Sie mirror.accounts.insert leichter anrufen, um das Konto zu erstellen.

Beispiel für einen RAW-HTTP-Post

Im folgenden Beispiel sind nur die URL der Anfrage und ein Beispiel für den erwarteten JSON-Text zu sehen. Das Senden von Roh-HTTP-Anfragen im Namen eines Dienstkontos ist viel komplizierter (weitere Informationen finden Sie unter OAuth 2.0 für Server-zu-Server-Anwendungen verwenden). Wir empfehlen daher, nach Möglichkeit eine unserer Google API-Clientbibliotheken zu verwenden.

Anfragemethode und URL:

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

Anfragetext:

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

Ersetzen Sie {userToken} in der Anfrage-URL durch das Token, das in Schritt 1 der Implementierung des Authentifizierungsablaufs an Ihre Authentifizierungs-URL übergeben wurde.

Java-Beispiel

In diesem Beispiel wird gezeigt, wie Sie mit der Java-Clientbibliothek mirror.accounts.insert aufrufen.

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();
  }
}

Konten in Glass abrufen

Das Abrufen und Verwenden von Account-Objekten in Glass ähnelt der Verwendung des standardmäßigen Android-AccountManager.

  1. Deklarieren Sie die folgenden Manifestberechtigungen in Ihrer AndroidManifest.xml-Datei:

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
  2. Rufen Sie die Konten der Glassware ab:

    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. Rufe ein Auth-Token von der Account ab:

    // 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);