במדריך הזה מתוארת קבוצה של תכונות שמחזירות אותות נוספים של מהימנות לגבי חשבון Google. אותות האמון האלה עוזרים למערכת לניהול החשבון לקבל החלטות מבוססות-סיכון במהלך ההרשמה, יצירת החשבון ובהמשך לגבי משתמשים חוזרים.
הגדרה
כדי לקבל טענות נוספות, האפליקציה צריכה להיות מפורסמת, מאומתת ותכונות חבילת האבטחה צריכות להיות מופעלות.
כדי לוודא שהאפליקציה פורסמה ואומתה:
- פתיחה של פלטפורמת האימות של Google
- בוחרים או יוצרים את הפרויקט של האפליקציה
- בתפריט, לוחצים על קהל.
- מוודאים שסטטוס הפרסום הוא בשלבי הפקה
- בתפריט, לוחצים על מרכז האימות.
מוודאים שסטטוס האימות הוא מאומת.
מידע נוסף זמין במרכז העזרה בנושא אימות אפליקציות OAuth.
כדי להפעיל את הטענה auth_time:
- פתיחה של פלטפורמת האימות של Google
- בוחרים או יוצרים את הפרויקט של האפליקציה
- לוחצים על הגדרות בתפריט.
- בקטע הגדרות מתקדמות, בוחרים באפשרות טענות לגבי גיל הסשן כדי להפעיל את
auth_time.
תכונות נתמכות
בקטע הזה מפורטות התכונות השונות שכלולות בחבילת האבטחה.
auth_time
הצהרת auth_time היא חלק סטנדרטי בפרוטוקול OpenID Connect, והיא מספקת מידע על הפעם האחרונה שמשתמש הקצה עבר אימות ב-Google. זהו מספר בפורמט JSON שמייצג את מספר השניות שחלפו מאז ראשית זמן יוניקס (1 בינואר 1970, 00:00:00 UTC). זהו הזמן שבו המשתמש עבר אימות בפעם האחרונה. אפשר לחשוב על זה כחותמת זמן שמציינת את אירוע הכניסה האחרון של המשתמש לחשבון Google מהמכשיר או מהדפדפן הנוכחיים.
התביעה הזו נכללת באסימון המזהה, שהוא אסימון אינטרנט מסוג JSON (JWT) שמכיל מידע מאומת על האימות ועל המשתמש.
התביעה auth_time חשובה לאפליקציה שלכם כי היא מאפשרת לכם לקבוע מתי משתמש התחבר באופן פעיל לחשבון Google במכשיר או בדפדפן שבו הוא משתמש. הדבר חשוב במיוחד למטרות אבטחה, כמו:
לקבל החלטה מושכלת לגבי הצורך להוסיף לאפליקציה שלכם שלב נוסף של אימות זהות לפני ביצוע פעולות רגישות של משתמשים, כמו מחיקת החשבון, שינוי אמצעי התשלום או שינוי הפרטים ליצירת קשר בחשבון. Google לא תומכת בבקשות לאימות מחדש של חשבון Google.
שימוש בנתונים על טריות ויציבות של סשן בחשבון Google של המשתמש כאות מהימן. באופן כללי, ערך עדכני של
auth_timeמעיד על רעננות, בעוד שערך ישן יותר מעיד על יציבות.
באפליקציות אינטרנט, השילוב של הדפדפן ומערכת ההפעלה של המשתמש מהווה סשן אחרי שהמשתמש נכנס לחשבון Google שלו.
במקביל, באתר שלכם מתנהל סשן משתמש נפרד. ערך חדש יותר של auth_time מציין שהמשתמש נכנס לאחרונה לחשבון Google שלו.
לרוב, זהו סימן למשתמש פעיל ומעורב, ואפשר לפרש את זה כסימן לסיכון נמוך יותר.
בפלטפורמות לנייד, כמו Android, המשתמשים בדרך כלל נכנסים ישירות למכשיר שלהם באמצעות שיטות ביומטריות כמו טביעת אצבע או סריקת פנים, וביטול נעילה באמצעות קוד אימות או קו ביטול נעילה שספציפיים למכשיר. באפליקציות ובפלטפורמות לנייד משתמשים לעיתים קרובות בשיטות אימות שמבוססות על הפלטפורמה, במקום ליצור סשן חדש עם Google. כתוצאה מכך, הכניסות לחשבון Google לא מתבצעות לעיתים קרובות, והעדכונים ל-auth_time לא מתבצעים לעיתים קרובות גם כן. לכן, ערך auth_time עדכני עשוי להצביע על שינוי בסשן של חשבון Google שפועל במשך זמן רב, וכך להצביע על סיכון מוגבר.
אותות אמון הם נושא מורכב. השימוש ב-auth_time צפוי להתבצע יחד עם אותות אחרים, כמו האם מופעל אימות רב-שלבי (MFA), שיטת האימות שבה נעשה שימוש ומשך סשן המשתמש בין האפליקציה לפלטפורמה שלכם.
בקשת auth_time
השיטה הספציפית שבה משתמשים כדי לבקש את טענת הזכויות auth_time משתנה בהתאם ל-API שבו משתמשים, אבל כל API כולל פרמטר אופציונלי claims לבקשת auth_time.
פרוטוקול OIDC
כשמשתמשים בפלטפורמת OAuth ישירות, מבקשים את auth_time על ידי הוספתו לפרמטר האופציונלי של בקשת הטענות. מגדירים את הערך של השדה id_token
באובייקט ה-JSON של הטענות ל-{"auth_time":{"essential":true}}. לדוגמה,
https://accounts.google.com/o/oauth2/v2/auth? response_type=id_token& client_id=YOUR_CLIENT_ID& scope=openid email profile& redirect_uri=https://example.com/user-login& nonce=123-456-7890& claims={"id_token":{"auth_time":{"essential":true}}}
מידע נוסף זמין במאמר בנושא OpenID Connect.
GIS for Web
לספרייה Sign in with Google for Web יש שני ממשקי API: HTML ו-JavaScript, שמאפשרים לבקש הצהרות נוספות. לדוגמה, בקשה auth_time באמצעות JavaScript API:
<html>
<body>
<script src="https://accounts.google.com/gsi/client" async></script>
<script>
window.onload = function () {
google.accounts.id.initialize({
client_id: "YOUR_WEB_CLIENT_ID",
callback: function(rsp) { console.log(rsp.credential); },
essential_claims: "auth_time",
});
google.accounts.id.renderButton(
document.getElementById("buttonDiv"),
{ type: "standard", size: "large" }
);
}
</script>
<div id="buttonDiv"></div>
</body>
</html>מידע נוסף זמין במאמר בנושא כניסה באמצעות חשבון Google לאינטרנט.
GIS ל-Android
משתמשים בשיטת setClaims ובאובייקט Claim כדי לבקש auth_time.
כדי להשתמש בגרסאות העדכניות ביותר של הספריות androidx.credentials:credentials-play-services-auth ו-com.google.android.libraries.identity.googleid:googleid, צריך לעדכן את יחסי התלות של ה-build.
יוצרים מופע של אובייקט Claim מסוג auth_time, ומשתמשים ב-setClaims כדי להוסיף אותו לאפשרויות הכניסה:
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder() .setAutoSelectEnabled(true) .setFilterByAuthorizedAccounts(true) .setServerClientId(WEB_CLIENT_ID) .setNonce("NONCE") .setClaims(ImmutableList.of(new Claim("auth_time", true))) .build()
מידע נוסף זמין במאמר אימות משתמשים באמצעות כניסה באמצעות חשבון Google.
iOS
Sign in with Google SDK ל-iOS מוסיף אובייקט authTimeClaim ופרמטר claims למחלקה GIDSignIn שמשמשים לבקשת auth_time באופן אופציונלי.
אפליקציות שמשתמשות ב-ASWebAuthenticationSession מעדכנות קובץ Cookie משותף שזמין לכל האפליקציות במכשיר. GIDSignIn משתמש בשיטה הזו כברירת מחדל ב-iOS מגרסה 12 ואילך וב-macOS מגרסה 12.16 ואילך. בתרחיש הזה, משתמש שנכנס לחשבון Google שלו מאומת והסשן מאוחסן במאגר קובצי ה-Cookie המשותף.
כאן auth_time מוצג האימות האחרון של המשתמש ב-Google במכשיר,
ולא רק באפליקציה שלכם.
SFSafariViewController, WKWebView ו-UIWebView פועלים בארגזי חול מבודדים בתוך האפליקציה, לכן מומלץ להימנע משימוש בהם כשמשתמשים ב-auth_time. הערך כאןauth_time מייצג את הכניסה האחרונה של המשתמש לאפליקציה עצמה. מכיוון שהערך תמיד עדכני, הוא פחות משמעותי.
כדי לבקש auth_time, צריך לעדכן את התלויות של GoogleSignIn לגרסה האחרונה וליצור אובייקט authTimeClaim, ולהוסיף אותו לקבוצת claims.
Swift
מוסיפים את קבוצת התביעות לשיטה GIDSignIn.sharedInstance.signIn:
let authTimeClaim = GIDClaim.authTime() let claims = Set([authTimeClaim])// Start the sign-in process GIDSignIn.sharedInstance.signIn( withPresenting: rootViewController, claims: claims ) { signInResult, error in guard let result = signInResult else { print("Error signing in: (error?.localizedDescription ?? "No error description")") return } // If sign in succeeded, display the app's main content View print("ID Token: (result.user.idToken?.tokenString ?? "No token")") }
Objective-C
מוסיפים את קבוצת התביעות לשיטה signInWithPresentingViewController:
GIDClaim *authTimeClaim = [GIDClaim authTimeClaim]; NSSet *claims = [NSSet setWithObject:authTimeClaim];// Include the claims set and start the sign-in process [GIDSignIn.sharedInstance signInWithPresentingViewController:self hint:nil claims:claims completion:^(GIDSignInResult * _Nullable signInResult, NSError * _Nullable error) { // On success signInResult.user.idToken // contains the requested claims. }];
מידע נוסף זמין במאמר שילוב של כניסה לחשבון Google באפליקציית iOS או macOS.
תגובת auth_time
כשauth_time ההצהרה נכללת בבקשה, היא מופיעה בתגובת מטען ה-ID Token לצד הצהרות סטנדרטיות אחרות כמו iss (מנפיק), sub (נושא), aud (קהל) ו-exp (זמן תפוגה). הערך של הטענה auth_time הוא מספר JSON שמייצג את מספר השניות שחלפו מאז ראשית זמן יוניקס (1 בינואר 1970, 00:00:00 UTC) ועד למועד שבו התרחש לאחרונה אימות המשתמש. זו דוגמה לטוקן מזהה מפוענח
שכולל את טענת auth_time:
{ "iss": "https://accounts.google.com", "azp": "YOUR_CLIENT_ID", "aud": "YOUR_CLIENT_ID", "sub": "117726431651943698600", "email": "alice@example.com", "email_verified": true, "nonce": "123-456-7890", "auth_time": 1748875426, "nbf": 1748880889, "name": "Elisa Beckett", "picture": "https://lh3.googleusercontent.com/a/default-user=s96-c", "given_name": "Elisa", "family_name": "Beckett", "iat": 1748881189, "exp": 1748884789, "jti": "8b5d7ce345787d5dbf14ce6e08a8f88ee8c9b5b1" }
אסימון המזהה מכיל גם הצהרה iat (הונפק בתאריך), שמציינת את השעה שבה הונפק ה-JWT. על ידי השוואה בין הצהרות iat ו-auth_time, אפשר לקבוע את הזמן שחלף מאז האימות האחרון של המשתמש ביחס למועד שבו נוצר אסימון המזהה הספציפי. לדוגמה, אם iat הוא 1748881189 ו-auth_time הוא 1748875426, ההפרש הוא 5, 763 שניות, שמייצגות שעה אחת, 36 דקות ו-3 שניות של זמן שחלף.