iOS アプリで Google API にアクセスする

ドライブや Gmail などの一部の Google サービスでは、ユーザーがこれらのサービスでデータを操作できるアプリの作成に使用できる公開 API が提供されています。これらのサービスにアクセスするには、アプリで OAuth 2.0 クライアント フローの 1 つを実装してユーザーから同意を得るとともに、API へのアクセスを許可するアクセス トークンを取得する必要があります。

OAuth 2.0 フローを実装する Google ログイン ライブラリを使用して、ログイン ユーザーのアクセス トークンを取得できます。

始める前に

Google ログインの基本的な統合を完了する必要があります。

1. 付与されているスコープを確認する

Google API を呼び出す前に、GIDGoogleUsergrantedScopes プロパティを使用して、すでにアプリに付与されているスコープを確認します。

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:callback または addScopes:presentingWindow:callback を呼び出して、アプリに追加のアクセス権を付与するようユーザーに依頼します。

たとえば、ユーザーのドライブへの読み取り専用アクセスをリクエストするには、次のようにします。

Swift

let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
GIDSignIn.sharedInstance.addScopes(additionalScopes, presenting: self) { user, error in
    guard error == nil else { return }
    guard let user = user else { return }

    // Check if the user granted access to the scopes you requested.
}

Objective-C

NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
[GIDSignIn.sharedInstance addScopes:additionalScopes
           presentingViewController:self
                           callback:^(GIDGoogleUser * _Nullable user,
                                      NSError * _Nullable error) {
    if (error) { return; }
    if (user == nil) { return; }

    // Check if the user granted access to the scopes you requested.
}];

3. 新しいトークンで API 呼び出しを行う

Google API 呼び出しに期限切れでないアクセス トークンが常に含まれるようにするには、呼び出しを doWithFreshTokens: ブロックでラップします。

Swift

user.authentication.do { authentication, error in
    guard error == nil else { return }
    guard let authentication = authentication else { return }

    // Get the access token to attach it to a REST or gRPC request.
    let accessToken = authentication.accessToken

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    let authorizer = authentication.fetcherAuthorizer()
}

Objective-C

[user.authentication doWithFreshTokens:^(GIDAuthentication * _Nullable authentication,
                                         NSError * _Nullable error) {
    if (error) { return; }
    if (authentication == nil) { return; }

    // Get the access token to attach it to a REST or gRPC request.
    NSString *accessToken = authentication.accessToken;

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    id<GTMFetcherAuthorizationProtocol> authorizer = [authentication fetcherAuthorizer];
}];

アクセス トークンを使用して API を呼び出します。その際、REST または gRPC リクエストのヘッダー(Authorization: Bearer ACCESS_TOKEN)にアクセス トークンを含めるか、Google API クライアント ライブラリでフェッチャー認証を使用します。