הרשאת גישה לנתוני משתמש ב-Android

האימות מאפשר לדעת מיהו המשתמש, ולרוב הוא נקרא 'הרשמה' או 'כניסה'. הרשאה היא התהליך של אישור או דחייה של גישה לנתונים או למשאבים. לדוגמה, האפליקציה מבקשת את הסכמת המשתמש לגישה ל-Google Drive.

קריאות לאימות ולהרשאה צריכים להיות שני תהליכי עבודה נפרדים ושונים, בהתאם לצרכים של האתר או האפליקציה.

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

צריך לבקש גישה להיקפים שנחוצים לכם כדי לגשת ל-Google APIs רק כשהמשתמש מבצע פעולה שמחייבת גישה ל-API מסוים. לדוגמה, עליכם לבקש הרשאת גישה ל-Drive של המשתמש בכל פעם שהמשתמש מקיש על לחצן 'שמירה ב-Drive'.

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

ב-Google Identity Services, האימות מתבצע באמצעות SignInClient. כדי להעניק הרשאה לפעולות שצריכות גישה לנתוני משתמשים ששמורים ב-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);
  }
}