אימות עבור GDK Glassware

אם ה-GDK Glassware צריך לאמת משתמשים מול שירות אינטרנט, ה-GDK מספק ממשק API שמאפשר למשתמש להזין את פרטי הכניסה שלו במהלך ההתקנה של ה-Glassware.

השימוש ב-API הזה מספק חוויית שימוש עקבית למשתמשי Glass, ונמנע מתקורה של הטמעת סכימות אימות בהתאמה אישית.

יצירת חשבון שירות של Google API

כאשר האימות מוגדר כראוי, הקצה העורפי של אפליקציית האינטרנט משתמש ב-שיקוף ה-API כדי לדחוף את פרטי החשבון של המשתמשים ל-Glass לאחר שהם מבצעים אימות באמצעות השירות שלכם.

כדי לגשת לממשק ה-API הזה, צריך ליצור פרויקט ב-Google API ואז ליצור מזהה לקוח ל'חשבון שירות' (ולא ל'אפליקציית אינטרנט'). כשאתם משתמשים בחשבון שירות, המשתמשים לא צריכים לתת בנפרד לכל אפליקציה הרשאת גישה ל-Glass, והם גם לא יוצגו עם דף ההרשאות של OAuth וגם עם דף האימות שלכם.

כדי ליצור את החשבון:

  1. נכנסים ל-Google Developers Console.
  2. לוחצים על Create Project כדי ליצור את המידע המבוקש.
  3. לאחר יצירת הפרויקט, שימו לב למספר הפרויקט, שתזדקקו לו מאוחר יותר.
  4. בקטע APIs ו-auth, לוחצים על APIs ומפעילים את Google שיקוף API בפרויקט החדש.
  5. בקטע APIs & amp; auth, לוחצים על Credentials ואז על Create New Client ID. סמנו את התיבה חשבון שירות כדי ליצור מזהה לקוח חדש של OAuth 2.0 עבור הפרויקט.
  6. חלון קופץ יודיע לכם שהמפתח הפרטי עובר הורדה למחשב, והוא יספק לכם את הסיסמה למפתח הפרטי הזה. לאחר שתסגור את החלון הזה, לא תוכל להוריד את המפתח הפרטי הזה או לראות שוב את הסיסמה. במקרה של אובדן, צריך ליצור חשבון חדש.
  7. רשמו את כתובת האימייל של חשבון השירות, שתזדקקו לו מאוחר יותר כדי לבצע את קריאת ה-API.

שליחת מטא-נתונים לגבי Glassware

כשתהיו מוכנים לשלוח את Glassware, תצטרכו למסור את הפרטים הבאים. כך נוכל להגדיר אימות תקין של Glassware כאשר תטמיעו אותו.

  • כתובת האתר לאימות, שאליה המשתמשים מופנים כשהם מפעילים את Glassware ב-MyGlass.
  • סוג החשבון (המחרוזת שבה תשתמש כשתתקשר לממשקי ה-API של Android AccountManager במכשיר ה-Glass)
  • שם החבילה של האפליקציה מה-AndroidManifest.xml
  • מזהה הפרויקט המספרי ב-Google API של הפרויקט שיצרתם למעלה
  • ה-APK שיש להעלות ב-MyGlass. כדי לבדוק זאת, צריך לספק את ה-APK הזה רק פעם אחת כדי לטפל בהורדה הראשונית כש-Glassware מופעל מ-MyGlass. לאחר מכן תוכלו להחליף את כל ה-APK במכשיר שלכם ולנפות באגים באופן מקומי. שימו לב שה-APK שלכם צריך לעמוד בקריטריונים הבאים:
    • חייב להיות מיושר ל-zip.
    • לאחר מכן, אסור לבצע שינויים בשם החבילה או במפתח החתימה הפרטי (מנהל החבילות ל-Android לא מאפשר שדרוג אם אף אחד מהשינויים האלה מתבצע).
    • היא צריכה להיות קטנה מ-50 מגה-בייט.
    • יש להדר אותו באמצעות הגרסה העדכנית ביותר של GDK.

הטמעת תהליך האימות

התרשים הבא מציג את תהליך האימות הבסיסי ל-GDK Glassware:

כדי להטמיע את תהליך האימות:

  1. כשמשתמשים מפעילים את Glassware ב-MyGlass, הם מופנים לכתובת ה-URL לאימות. הבקשות האלה כוללות פרמטר שאילתה שנקרא userToken, ואתם צריכים להשתמש בו מאוחר יותר.

  2. המשתמש יזין את פרטי הכניסה בדף האימות.

  3. השרת מאמת את פרטי הכניסה של המשתמש. אם פרטי הכניסה תקפים, קראו ל-שיקוף API לשיטה mirror.accounts.insert. בשיטה הזו צריך לציין את ההיקף של https://www.googleapis.com/auth/glass.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 שולח את החשבון למכשירי ה-Glass של המשתמש, ועכשיו אפשר לגשת אליו דרך המחלקה AccountManager.

מומלץ לפעול לפי ההנחיות הבאות כדי להטמיע תהליך אימות ידידותי למשתמש:

  • אופטימיזציה של תהליך העבודה במכשירים ניידים.
  • אם ההיקף שלכם כולל היקף והמשתמש מבטל אותו, כדאי ליצור הודעת שגיאה שתוכננה היטב.
  • מוודאים שהיקפי ההרשאות שאתם שולחים נמצאים בשימוש ב-Glassware שלכם.
  • אם אפשר לקשר חשבון משתמש, ודאו שאתם מקשרים אותו.
  • אם אפשר, נתוני המשתמשים יגובו בענן.

כדי לשמור על עקביות באימות של Glassware, צריך להשתמש באחד מתהליכי האימות הבאים:

שיקוף או עסק משולב ללא חשבון

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
  2. זה שולח את המשתמש ישירות להיקפים שיש לאשר.
  3. אחרי שהמשתמש מאשר או מבטל את ההיקפים, סוגרים את החלון הקופץ.

שיקוף עם חשבון

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
    • אם המשתמש כבר מחובר לשירות שלכם, עליכם לשלוח אותו ישירות להיקפים.
    • אם המשתמש לא מחובר לחשבון, מציגים את שדות הכניסה, מאפשרים לו להיכנס לשירות ואז שולחים אותו להיקפים.
    • אם למשתמש אין חשבון, ספקו קישור ליצירת חשבון. למשתמשים צריכה להיות אפשרות ליצור חשבון כחלק מתהליך ההתקנה.
  2. המשתמש מקבל היקפים.
    • אם ל-Glassware יש הגדרות שניתן לקבוע, שלחו את המשתמש לדף ההגדרות עם ברירות מחדל סבירות.
    • אם ל-Glassware אין הגדרות שניתן לשנות, שלחו את המשתמש לדף אישור. אם אין צורך בהגדרות נוספות, כדאי לסגור את החלון הקופץ.

עסק משולב עם חשבון

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
    • אם המשתמש כבר מחובר לשירות שלכם, עליכם לשלוח אותו ישירות להיקפים.
    • אם המשתמש לא מחובר לחשבון, מציגים שדות כניסה, מאפשרים לו להיכנס ולאחר מכן שולחים אותו להיקפים.
    • אם למשתמש אין חשבון, יש לספק קישור ליצירת חשבון.
  2. המשתמש מקבל היקפים.
  3. כדי להוסיף את חשבון GDK, שולחים בקשה ל-Mirror API.
    • שליחת המשתמש לדף ההגדרות לאחר בחירת ברירות מחדל סבירות.
    • שליחת דף אישור למשתמש. אם אין צורך בהגדרות נוספות, כדאי לסגור את החלון הקופץ.

שיקוף או היברידי עם חשבון והיקפים מותאמים אישית

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
    • אם המשתמש כבר מחובר לשירות שלכם, עליכם לשלוח אותו להיקפים הפנימיים שלכם.
    • אם המשתמש לא מחובר לחשבון, מציגים שדות כניסה, מאפשרים לו להיכנס ואז שולחים אותם להיקפים הפנימיים
    • אם למשתמש אין חשבון, יש לספק קישור ליצירת חשבון.
  2. כשהמשתמש מאשר את ההיקפים המותאמים אישית, יש לשלוח אותו להיקפי ההרשאות של Google.
  3. כדי להוסיף את חשבון GDK, שולחים בקשה ל-Mirror API.
    • שליחת המשתמש לדף ההגדרות לאחר בחירת ברירות מחדל סבירות.
    • שליחת דף אישור למשתמש. אם אין צורך בהגדרות נוספות, כדאי לסגור את החלון הקופץ.

שיקוף או היברידי עם אפליקציית Android/iPhone

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
  2. זה שולח את המשתמש ישירות להיקפים שיש לאשר.
  3. אחרי שהמשתמש מאשר את ההיקפים:
    • אם למשתמש יש אפליקציה נלווית והוא מאומת, סוגרים את החלון הקופץ.
    • אם לא, צריך לשלוח את המשתמש למודעת מעברון שתנחה אותו להוריד את האפליקציה מחנות Google Play או מחנות iOS
  4. לאחר התקנת האפליקציה והאימות, צריך לסגור את החלון הקופץ

GDK וללא חשבון

החלפת המצב של Glassware ב-MyGlass הוא כל מה שנדרש לתהליך זה.

תמ"ג עם חשבון

  1. לאחר הפעלת המצב ב-MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
    • אם המשתמש כבר מחובר לשירות, שולחים אותו למסך האישור.
    • אם המשתמש לא מחובר לחשבון, מציגים את שדות הכניסה, מאפשרים לו להיכנס ולאחר מכן שולחים אותו למסך האישור.
    • אם למשתמש אין חשבון, יש לספק קישור ליצירת חשבון.
  2. המשתמש מקבל היקפים.
  3. כדי להוסיף את חשבון GDK, שולחים בקשה ל-Mirror API.
  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);