ドライブや Gmail などの一部の Google サービスでは、公開 API が提供されています。この API を使用して、ユーザーがこれらのサービスでデータを操作できるようにするアプリを作成できます。これらのサービスにアクセスするには、アプリで OAuth 2.0 クライアント フローのいずれかを実装して、ユーザーから同意を得て、API へのアクセスを許可するアクセス トークンを取得する必要があります。
Google ログイン ライブラリを使用すると、OAuth 2.0 フローが実装され、ログイン ユーザーのアクセス トークンを取得できます。
前提条件
iOS アプリから Google API を呼び出す前に、次の設定手順を完了します。
1. プロジェクトでAPI を有効にする
Google API を呼び出すアプリケーションは、Google Cloud コンソールでそれらの API を有効にする必要があります。
プロジェクトで API を有効にするには:
- Google Cloud コンソールで API ライブラリを開きます。
- プロンプトが表示されたら、既存のプロジェクトのいずれかを選択するか、新しいプロジェクトを作成します。
- 有効にする API を選択し、[有効にする] をクリックします。
2. 承認認証情報を作成する
OAuth 2.0 を使用して Google API にアクセスする iOS アプリケーションには、Google 認証サーバーに対してアプリケーションを識別する認証情報が必要です。次の手順では、プロジェクトの認証情報を作成する方法について説明します。
- Google Cloud コンソールの [認証情報] ページに移動します。
- [クライアントを作成](または [認証情報を作成] > [OAuth クライアント ID])をクリックします。
- [iOS] アプリケーションの種類を選択します。
- OAuth クライアントの名前を入力します。この名前は、プロジェクトの [認証情報] ページでクライアントを識別します。
- アプリのバンドル ID を入力します。バンドル ID は、アプリの
Info.plistにあるCFBundleIdentifierキーの値です。この値は通常、Xcode プロジェクト エディタの [General] ペインまたは [Signing & Capabilities] ペイン、または Apple App Store Connect の [App Information] ページに表示されます。App Check を使用している場合は変更できないため、正しいバンドル ID を使用していることを確認してください。 - (省略可)アプリが Apple App Store で公開されている場合は、アプリの App Store ID を入力します。ストア ID は、すべての Apple アプリストア URL に含まれる数字の文字列です。
- (省略可)チーム ID を入力します。Apple Developer アカウントのドキュメントのチーム ID を確認するをご覧ください。クライアントで App Check を有効にする場合は、チーム ID が必要です。
- (省略可)iOS アプリで App Check を有効にします。App Check を有効にすると、Apple の App Attest サービスを使用して、OAuth クライアントから送信された OAuth 2.0 リクエストが正規のものであり、アプリから送信されたものであることを確認します。これにより、アプリのなりすましのリスクを軽減できます。
- [作成] をクリックします。
クライアント ID が生成され、Google Cloud コンソールに表示されます。反転クライアント ID の URL スキーム(com.googleusercontent.apps.1234567890-abcdef など)をアプリの Info.plist に追加して、認証リダイレクトを処理します。
3. Google ログインの基本的な統合を完了する
増分スコープをリクエストして Google API を呼び出す前に、基本的な Google ログインの統合を完了します。
1. 付与されているスコープを確認する
Google API を呼び出す前に、GIDGoogleUser の grantedScopes プロパティを使用して、アプリにすでに付与されているスコープを確認します。
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 を呼び出して、アプリに追加のアクセス権を付与するようユーザーに依頼します。
たとえば、ユーザーのドライブ ファイルへの読み取り専用アクセスをリクエストするには、次のようにします。
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 API クライアント ライブラリでフェッチャー認可機能を使用します。