האימות קובע מי מי, והוא נקרא בדרך כלל רישום או כניסה של משתמש. הרשאה היא תהליך של הענקת גישה לנתונים או למשאבים או דחייה של גישה אליהם. לדוגמה, האפליקציה מבקשת מהמשתמשים הסכמה לגשת ל-Google Drive שלהם.
קריאות האימות וההרשאה צריכות להיות שני תהליכים נפרדים ומנויים, בהתאם לצרכים של האפליקציה.
אם באפליקציה שלכם יש תכונות שיכולות להשתמש בנתוני Google API, אבל הן לא נדרשות כחלק מהתכונות המרכזיות של האפליקציה, כדאי לתכנן את האפליקציה כך שתוכל לטפל בצורה חלקה במקרים שבהם אין גישה לנתוני ה-API. לדוגמה, תוכלו להסתיר רשימה של קבצים שנשמרו לאחרונה אם המשתמש לא העניק גישה ל-Drive.
צריך לבקש גישה להיקפים הנדרשים כדי לגשת לממשקי Google API רק כשהמשתמש מבצע פעולה שדורשת גישה ל-API ספציפי. לדוגמה, צריך לבקש הרשאה לגשת ל-Drive של המשתמש בכל פעם שהוא מקייש על הלחצן 'שמירה ב-Drive'.
הפרדה בין הרשאה לאימות מונעת עומס על משתמשים חדשים, או בלבול של משתמשים לגבי הסיבה שבגללה הם מתבקשים להעניק הרשאות מסוימות.
לאימות, מומלץ להשתמש ב-Credential Manager API. כדי לאשר פעולות שדורשות גישה לנתוני משתמשים ששמורים ב-Google, מומלץ להשתמש ב-AuthorizationClient.
בקשת הרשאות שנדרשות לפעולות של משתמשים
בכל פעם שמשתמש מבצע פעולה שדורשת היקף נוסף, צריך לבצע קריאה ל-AuthorizationClient.authorize()
.
לדוגמה, אם משתמש מבצע פעולה שדורשת גישה לאחסון של אפליקציית Drive, צריך לבצע את הפעולות הבאות:
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
.authorize(authorizationRequest)
.addOnSuccessListener(
authorizationResult -> {
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
PendingIntent pendingIntent = authorizationResult.getPendingIntent();
try {
startIntentSenderForResult(pendingIntent.getIntentSender(),
REQUEST_AUTHORIZE, null, 0, 0, 0, null);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
}
} else {
// Access already granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
ב-callback של onActivityResult
בפעילות, אפשר לבדוק אם ההרשאות הנדרשות התקבלו, ואם כן, לבצע את הפעולה של המשתמש.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
saveToDriveAppFolder(authorizationResult);
}
}