Einige Google-Dienste wie Drive, Gmail und viele andere bieten öffentliche APIs an, mit denen Sie Anwendungen erstellen können, die Nutzern die Arbeit mit ihren Daten in diesen Diensten erleichtern. Für den Zugriff auf diese Dienste müssen Anwendungen einen der OAuth 2.0-Clientabläufe implementieren, um die Einwilligung der Nutzer einzuholen und Zugriffstokens abzurufen, die Zugriff auf die APIs gewähren.
Du kannst die Google Log-in-Bibliothek verwenden, die den OAuth 2.0-Vorgang für dich implementiert, um Zugriffstokens für den angemeldeten Nutzer zu erhalten.
Hinweis
Du musst die grundlegende Google Log-in-Integration durchführen.
1. Prüfen, welche Bereiche gewährt wurden
Prüfen Sie vor dem Aufruf einer Google API, welche Bereiche Ihrer Anwendung bereits gewährt wurden. Verwenden Sie dazu das Attribut grantedScopes
von 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
}
Je nachdem, ob der Nutzer einen bestimmten Bereich gewährt hat oder nicht, müssen Sie möglicherweise einen zusätzlichen Bereich anfordern, um eine bestimmte Interaktion zu unterstützen.
2. Zusätzliche Bereiche anfordern
Wenn Sie zusätzliche Bereiche anfordern müssen, rufen Sie addScopes:presentingViewController:completion
oder addScopes:presentingWindow:completion
auf, um den Nutzer aufzufordern, Ihrer Anwendung zusätzlichen Zugriff zu gewähren.
So fordern Sie beispielsweise Lesezugriff auf die Drive-Dateien eines Nutzers an:
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-Aufruf mit neuen Tokens ausführen
Damit an Ihre Google API-Aufrufe immer unbefristete Zugriffstokens angehängt sind, verpacken Sie die Aufrufe in einen refreshTokensIfNeededWithCompletion:
-Block:
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];
}];
Verwenden Sie das Zugriffstoken, um die API aufzurufen. Dazu nehmen Sie das Zugriffstoken in den Header einer REST- oder gRPC-Anfrage (Authorization: Bearer ACCESS_TOKEN
) auf oder verwenden den Autorisierenden des Abrufs mit der Google APIs-Clientbibliothek.