חלק משירותי Google, כמו Drive, Gmail ורבים אחרים, מספקים ממשקי API ציבוריים שבהם אתם יכולים להשתמש כדי ליצור אפליקציות שעוזרות למשתמשים לעבוד עם הנתונים שלהם בשירותים האלה. כדי לגשת לשירותים האלה, האפליקציות צריכות להטמיע את אחד מתהליכי הלקוח של OAuth 2.0 כדי לקבל הסכמה מהמשתמשים ולקבל טוקני גישה, שמעניקים גישה לממשקי ה-API.
אתם יכולים להשתמש בספריית "כניסה באמצעות חשבון Google", שמטמיעה את ההרשאה באמצעות OAuth 2.0, כדי לקבל טוקני גישה למשתמש שמחובר לחשבון.
דרישות מוקדמות
כדי שהאפליקציה ל-iOS תוכל לשלוח קריאות ל-Google APIs, צריך לבצע את השלבים הבאים:
1. הפעלת ממשקי API בפרויקט
בכל אפליקציה שמבצעת קריאות לממשקי Google API, צריך להפעיל את ממשקי ה-API האלה במסוף Google Cloud.
כדי להפעיל API בפרויקט:
- פותחים את ספריית ה-API במסוף Google Cloud.
- אם מתבקשים, בוחרים פרויקט או יוצרים פרויקט חדש.
- בוחרים את ה-API שרוצים להפעיל ולוחצים על Enable.
2. יצירת פרטי כניסה לאימות
כל אפליקציית iOS שמשתמשת ב-OAuth 2.0 כדי לגשת ל-Google APIs צריכה פרטי כניסה לאימות שמזהים את האפליקציה בשרת האימות של Google. כך יוצרים פרטי כניסה לפרויקט:
- נכנסים לדף Credentials במסוף Google Cloud.
- לוחצים על Create client (או על Create Credentials > OAuth client ID).
- בוחרים את סוג האפליקציה iOS.
- מזינים שם ללקוח OAuth. השם הזה מזהה את הלקוח בדף Credentials של הפרויקט.
- מזינים את מזהה החבילה של האפליקציה. מזהה החבילה הוא הערך של המפתח
CFBundleIdentifierבקובץInfo.plistשל האפליקציה. הערך מוצג בדרך כלל בחלונית General (כללי) או בחלונית Signing & Capabilities (חתימה ויכולות) של עורך הפרויקטים ב-Xcode, או בדף App Information (פרטי האפליקציה) ב-Apple App Store Connect. חשוב לוודא שאתם משתמשים במזהה החבילה הנכון, כי אי אפשר לשנות אותו אם משתמשים ב-App Check. - (אופציונלי) אם האפליקציה פורסמה ב-Apple App Store, מזינים את מזהה האפליקציה ב-App Store. מזהה החנות הוא מחרוזת מספרית שכלולה בכל כתובת URL של Apple App Store.
- (אופציונלי) מזינים את מזהה הצוות. אפשר לקרוא את המאמר Locate your Team ID במסמכי התיעוד של חשבון הפיתוח של אפל. אם מפעילים את App Check ללקוח, צריך לציין את מזהה הצוות.
- (אופציונלי) מפעילים את App Check באפליקציה ל-iOS. כשמפעילים את App Check, שירות App Attest של אפל משמש לאימות של בקשות OAuth 2.0 שמגיעות מלקוח OAuth, כדי לוודא שהן אמיתיות ומגיעות מהאפליקציה שלכם. כך אפשר לצמצם את הסיכון להתחזות לאפליקציה.
- לוחצים על יצירה.
מזהה הלקוח נוצר ומוצג במסוף Google Cloud. מוסיפים את סכמת כתובת ה-URL ההפוכה של מזהה הלקוח (לדוגמה, com.googleusercontent.apps.1234567890-abcdef) לקובץ Info.plist של האפליקציה כדי לטפל בהפניות להרשאה.
3. השלמת השילוב הבסיסי של "כניסה באמצעות חשבון Google"
לפני שאתם מבקשים היקפים מצטברים וקוראים ל-Google APIs, אתם צריכים להשלים את ההטמעה הבסיסית של כניסה באמצעות חשבון Google.
1. איך בודקים אילו היקפי הרשאות ניתנו
לפני ששולחים קריאה ל-Google API, בודקים אילו היקפי הרשאות כבר הוענקו לאפליקציה, באמצעות המאפיין grantedScopes של GIDGoogleUser:
Swift
let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
// Request additional Drive scope.
}
Objective-C
NSString *driveScope = @"https://www.googleapis.com/auth/drive.readonly";
// Check if the user has granted the Drive scope
if (![user.grantedScopes containsObject:driveScope]) {
// request additional drive scope
}
בהתאם להיקף ההרשאות שהמשתמש העניק, יכול להיות שתצטרכו לבקש היקף הרשאות נוסף כדי לתמוך באינטראקציה מסוימת.
2. בקשה להיקפי הרשאות נוספים
אם אתם צריכים לבקש היקפי הרשאות נוספים, קוראים ל-addScopes:presentingViewController:completion או ל-addScopes:presentingWindow:completion כדי לבקש מהמשתמש לתת לאפליקציה גישה נוספת.
לדוגמה, כדי לבקש הרשאת קריאה בלבד לקובצי Drive של משתמש:
Swift
let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
guard let currentUser = GIDSignIn.sharedInstance.currentUser else {
return ; /* Not signed in. */
}
currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in
guard error == nil else { return }
guard let signInResult = signInResult else { return }
// Check if the user granted access to the scopes you requested.
}
Objective-C
NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;
[currentUser addScopes:additionalScopes
presentingViewController:self
completion:^(GIDSignInResult * _Nullable signInResult,
NSError * _Nullable error) {
if (error) { return; }
if (signInResult == nil) { return; }
// Check if the user granted access to the scopes you requested.
}];
3. מבצעים קריאה ל-API עם טוקנים חדשים
כדי לוודא שלקריאות ל-Google API תמיד מצורפים אסימוני גישה בתוקף, צריך לעטוף את הקריאות בבלוק refreshTokensIfNeededWithCompletion::
Swift
currentUser.refreshTokensIfNeeded { user, error in
guard error == nil else { return }
guard let user = user else { return }
// Get the access token to attach it to a REST or gRPC request.
let accessToken = user.accessToken.tokenString
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
let authorizer = user.fetcherAuthorizer()
}
Objective-C
[currentUser refreshTokensIfNeededWithCompletion:^(
GIDGoogleUser * _Nullable user,
NSError * _Nullable error) {
if (error) { return; }
if (user == nil) { return; }
// Get the access token to attach it to a REST or gRPC request.
NSString *accessToken = user.accessToken.tokenString;
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
id<GTMFetcherAuthorizationProtocol> authorizer = [user fetcherAuthorizer];
}];
משתמשים בטוקן הגישה כדי לשלוח קריאה ל-API, על ידי הכללת טוקן הגישה בכותרת של בקשת REST או gRPC (Authorization: Bearer ACCESS_TOKEN), או על ידי שימוש במאשר השליפה עם ספריית הלקוח של Google APIs.