אם GDK Glassware צריך לאמת משתמשים מול שירות אינטרנט, ה-GDK מספק API שמאפשר למשתמשים להזין את פרטי הכניסה שלהם להתקין את ה-Glassware.
השימוש ב-API הזה מאפשר לכם לספק למשתמשים חוויית משתמש עקבית עבור משתמשי Glass ונמנעים מהתקורה של הטמעת סכמות אימות בהתאמה אישית.
יצירת חשבון שירות של Google API
אם האימות מוגדר בצורה נכונה, הקצה העורפי של אפליקציית האינטרנט משתמשת ב-Mirror API כדי לדחוף את המשתמשים פרטי חשבון ב-Glass אחרי שהם מבצעים אימות באמצעות השירות שלכם.
כדי לגשת ל-API הזה, צריך ליצור פרויקט ב-Google API ולאחר מכן ליצור מזהה לקוח ל'חשבון שירות' (ולא 'אפליקציית אינטרנט'). על ידי באמצעות חשבון שירות, המשתמשים לא צריכים להעניק בנפרד לדחוף את פרטי הכניסה שלהם ל-Glass ולא יוצג בדף הרשאות OAuth וגם בדף אימות משלכם שוב.
כדי ליצור את החשבון הזה:
- עוברים אל Google Developers Console.
- לוחצים על הלחצן Create Project ומזינים את המידע המבוקש.
- לאחר יצירת הפרויקט, רושמים לעצמכם את מספר הפרויקט, שתזדקקו להם בהמשך.
- בקטע APIs & אימות, לוחצים על APIs ומפעילים את Google Mirror API לפרויקט החדש שלכם.
- בקטע APIs & auth, ללחוץ על פרטי כניסה, ואז על צור לקוח חדש מזהה. מסמנים את התיבה עם התווית חשבון שירות כדי ליצור OAuth 2.0 חדש מזהה הלקוח של הפרויקט.
- בחלון הקופץ תופיע הודעה על כך שמתבצעת הורדה של המפתח הפרטי למחשב שלך ומספק לך את הסיסמה של המפתח הפרטי הזה. לאחר סגירת החלון, לא תהיה לך אפשרות להוריד את הקובץ הפרטי או לראות את הסיסמה שוב. אם הם יאבדו, תצטרכו ליצור חשבון חדש אחת.
- רושמים בצד את כתובת האימייל של חשבון השירות, שבו צריך להשתמש מאוחר יותר כדי לשלוח את הקריאה ל-API.
שליחת מטא-נתונים על ה-Glassware
כשתהיו מוכנים לשלוח את כלי ה-Glassware, תצטרכו לספק את הפרטים הבאים: המידע הבא. כך נוכל להגדיר את ה-Glassware מאומת כראוי כאשר אתה מיישם אותו.
- כתובת ה-URL לאימות, שאליה המשתמשים מופנים מחדש הם מפעילים את כלי הזכוכית שלך ב-MyGlass.
- סוג החשבון (המחרוזת שבה משתמשים כשמפעילים את
ממשקי API של Android
AccountManager
במכשיר Glass) - שם החבילה של האפליקציה מה-
AndroidManifest.xml
- מזהה הפרויקט המספרי של Google API של הפרויקט שיצרתם מעל
- ה-APK שצריך להעלות ב-MyGlass. כדי לבצע בדיקה, צריך רק לספק
ה-APK הזה יטפל בהורדה הראשונית כאשר ה-Glassware
מופעל מ-MyGlass; לאחר מכן, תוכלו לבצע איטרציה ולנפות באגים באופן מקומי
על ידי החלפת ה-APK במכשיר שלך. לתשומת ליבכם: ה-APK הזה צריך לעמוד בדרישות
הקריטריונים הבאים:
- היא צריכה להיות מוצמדת ל-ZIP.
- אסור לבצע שינויים בשם החבילה או בחתימה הפרטית המפתח לאחר מכן (מנהל החבילות ב-Android לא מאפשר שדרוגים אם אחד מהם משתנה).
- הגודל המרבי המותר הוא 50 מגה-בייט.
- צריך להכין אותו בגרסה העדכנית ביותר של ה-GDK.
יישום של תהליך האימות
התרשים הבא מציג את תהליך האימות הבסיסי עבור זכוכית GDK:
כדי להטמיע את תהליך האימות:
כשמשתמשים מפעילים את Glassware ב-MyGlass, הם יופנו אוטומטית לכתובת ה-URL לאימות. הבקשות האלה כוללות פרמטר של שאילתה בשם
userToken
שיהיה צורך להשתמש בהם מאוחר יותר.המשתמש יזין את פרטי הכניסה שלו בדף האימות.
השרת שלך מאמת את פרטי הכניסה של המשתמש. אם פרטי הכניסה תקינים, ביצוע קריאה ל-API ב-Mirror ל-method
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
מחרוזת אסימון האימות. לאחר קבלת הבקשה
mirror.account.insert
, Mirror API דוחף החשבון למכשירי Glass של המשתמש, שם אתם יכולים לגשת אליהם עכשיו באמצעות המחלקהAccountManager
.
תהליכי אימות מומלצים
כדי להטמיע תהליך אימות ידידותי למשתמש, יש לפעול לפי ההנחיות הבאות:
- לבצע אופטימיזציה של התהליך למכשירים ניידים.
- אם התהליך כולל היקף והמשתמש מבטל אותן, חשוב הודעת שגיאה.
- יש לוודא שהיקפי ההרשאות שביקשתם נמצאים בשימוש ב-Glassware.
- אם ניתן לקשר חשבון משתמש, מוודאים שמחברים אותו.
- כשהדבר אפשרי, נתוני המשתמשים צריכים להיות מגובים לענן.
כדי לשמור על עקביות באימות של Glassware, צריך להשתמש באחת מהאפשרויות הבאות תהליכי האימות:
שיקוף או שילוב היברידי ללא חשבון
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- הפעולה הזו תשלח את המשתמש ישירות להיקפי ההרשאות כדי לאשר אותן.
- אחרי שהמשתמש יאשר או יבטל את היקפי ההרשאות, סוגרים את החלון הקופץ.
סנכרון בענן ובמחשב עם חשבון
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- אם המשתמש כבר מחובר לשירות, צריך לשלוח אותו ישירות. להיקפים שונים.
- אם המשתמש לא מחובר, מציגים את שדות הכניסה, מאפשרים לו להיכנס בשירות שלכם, ואז לשלוח אותם להיקפים.
- אם למשתמש אין חשבון, צריך לספק קישור כדי ליצור חשבון. חייבת להיות למשתמשים דרך ליצור חשבון תהליך ההתקנה שלו.
- המשתמש מקבל היקפים.
- אם ל-Glassware יש הגדרות שניתנות להגדרה, שולחים את המשתמש אל דף הגדרות עם ברירות מחדל סבירות שנבחרו.
- אם ל-Glassware אין הגדרות הניתנות להגדרה, שולחים את המשתמש אל דף אישור. סגירת החלון הקופץ אם לא הוגדרו הגדרות נוספות נדרש.
שילוב עם חשבון
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- אם המשתמש כבר מחובר לשירות, צריך לשלוח אותו ישירות. להיקפים שונים.
- אם המשתמש לא מחובר לחשבון, מציגים את שדות הכניסה ומאפשרים לו להיכנס ואז לשלוח אותם להיקפים.
- אם למשתמש אין חשבון, צריך לספק קישור כדי ליצור חשבון.
- המשתמש מקבל היקפים.
- שולחים בקשה ל-Mirror API כדי להוסיף את חשבון ה-GDK.
- שליחת המשתמש לדף ההגדרות עם ברירות מחדל סבירות שנבחרו.
- שולחים למשתמש דף אישור. סגירת החלון הקופץ אם אין אפשרויות נוספות נדרשת הגדרה אישית.
שיקוף או היקפים היברידיים עם חשבון והיקפים מותאמים אישית
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- אם המשתמש כבר מחובר לשירות, צריך לשלוח אותו אל היקפים פנימיים
- אם המשתמש לא מחובר לחשבון, מציגים את שדות הכניסה ומאפשרים לו להיכנס ואז לשלוח אותם להיקפים הפנימיים שלכם
- אם למשתמש אין חשבון, צריך לספק קישור כדי ליצור חשבון.
- כשהמשתמש מאשר את היקפי ההרשאות המותאמים אישית, צריך לשלוח אותו להיקפי ההרשאות של Google.
- שולחים בקשה ל-Mirror API כדי להוסיף את חשבון ה-GDK.
- שליחת המשתמש לדף ההגדרות עם ברירות מחדל סבירות שנבחרו.
- שולחים למשתמש דף אישור. סגירת החלון הקופץ אם אין אפשרויות נוספות נדרשת הגדרה אישית.
שיקוף או שילוב היברידי עם אפליקציה ל-Android/ל-iPhone
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- הפעולה הזו תשלח את המשתמש ישירות להיקפי ההרשאות כדי לאשר אותן.
- אחרי שהמשתמש מאשר את ההיקפים:
- אם למשתמש יש את האפליקציה הנלווית והוא מאומת, סוגרים את החלון הקופץ חלון.
- אם לא, יש לשלוח את המשתמש למודעת מעברון שתפנה אותו להוריד את אפליקציה מחנות Google Play או מחנות iOS
- אחרי התקנת האפליקציה והאימות, סוגרים את החלון הקופץ
GDK ואין חשבון
כדי לבצע את התהליך הזה נדרשת הפעלה של ה-Glassware ב-MyGlass.
GDK עם חשבון
- אחרי שמפעילים את MyGlass, כתובת ה-URL לאימות תיפתח בחלון קופץ.
- אם המשתמש כבר מחובר לשירות, צריך לשלוח אותו מסך האישור.
- אם המשתמש לא מחובר, יש להציג את שדות הכניסה ולאפשר לו: להיכנס לחשבון ולשלוח אותם למסך האישור.
- אם למשתמש אין חשבון, צריך לספק קישור כדי ליצור חשבון.
- המשתמש מקבל היקפים.
- שולחים בקשה ל-Mirror API כדי להוסיף את חשבון ה-GDK.
- הצגת מסך האישור וסגירת המסך לאחר הצגתו לפרק זמן קצר.
דוגמאות ליצירת חשבון
שימוש בספריות הלקוח
ל-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 של הבקשה באסימון שהועבר אל
את כתובת האתר לאימות בשלב 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
ושימוש בו
על עצמים על זכוכית דומה לשימוש
AccountManager
צריך להצהיר על ההרשאות הבאות במניפסט בקובץ
AndroidManifest.xml
:<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />
מאחזרים את החשבונות של 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.
אחזור אסימון אימות מה-
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);