サーバーが複数の IP アドレスを持ち、 ユーザーの代わりに、またはユーザーがオフラインのときに Google API 呼び出しを行えます。
始める前に
Google ログインの基本的な統合を完了している必要があります。
アプリのサーバーサイド API アクセスを有効にする
iOS アプリで Google API にアクセスする アプリはクライアントサイドでのみユーザーを認証します。その場合は ユーザーがアクティブに使用しているときにのみ、アプリが Google API にアクセスできる 説明します。
このページで説明する手順により、サーバーは Google API ユーザーの代わりに通話を着信できます。たとえば写真アプリは ユーザーの Google フォト アルバムにある写真をバックエンドで処理して補正する 結果を別のアルバムにアップロードします。そのためにサーバーは 更新トークンが必要です。
サーバーのアクセス トークンと更新トークンを取得するには、次の操作を行います。
サーバーが交換する 1 回限りの認証コードをリクエストします
使用します。ログインに成功すると、
GIDSignInResult
の serverAuthCode
プロパティ。
サーバー クライアント ID を取得します(まだ取得していない場合)。 アプリの
Info.plist
ファイルで、OAuth クライアント ID の下で指定します。<key>GIDServerClientID</key> <string>YOUR_SERVER_CLIENT_ID</string>
ログイン コールバックで、ワンタイム認証コードを取得します。
Swift
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in guard error == nil else { return } guard let signInResult = signInResult else { return } let authCode = signInResult.serverAuthCode }
Objective-C
[GIDSignIn.sharedInstance signInWithPresentingViewController:self completion:^(GIDSignInResult * _Nullable signInResult, NSError * _Nullable error) { if (error) { return; } if (signInResult == nil) { return; } NSString *authCode = signInResult.serverAuthCode; }];
HTTPS POST を使用して
serverAuthCode
文字列をサーバーに安全に渡します。アプリのバックエンド サーバーで、アクセス用の認証コードを交換して更新します。 使用します。アクセス トークンを使用して、ユーザーに代わって Google API を呼び出す。 必要に応じて更新トークンを保存し、更新トークンが トークンが期限切れになります。
次に例を示します。
Java
// (Receive authCode via HTTPS POST) if (request.getHeader("X-Requested-With") == null) { // Without the `X-Requested-With` header, this request could be forged. Aborts. } // Set path to the Web application client_secret_*.json file you downloaded from the // Google API Console: https://console.cloud.google.com/apis/credentials // You can also find your Web application client ID and client secret from the // console and specify them directly when you create the GoogleAuthorizationCodeTokenRequest // object. String CLIENT_SECRET_FILE = "/path/to/client_secret.json"; // Exchange auth code for access token GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE)); GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( new NetHttpTransport(), JacksonFactory.getDefaultInstance(), "https://oauth2.googleapis.com/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) // Specify the same redirect URI that you use with your web // app. If you don't have a web version of your app, you can // specify an empty string. .execute(); String accessToken = tokenResponse.getAccessToken(); // Use access token to call API GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); Drive drive = new Drive.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential) .setApplicationName("Auth Code Exchange Demo") .build(); File file = drive.files().get("appfolder").execute(); // Get profile info from ID token GoogleIdToken idToken = tokenResponse.parseIdToken(); GoogleIdToken.Payload payload = idToken.getPayload(); String userId = payload.getSubject(); // Use this value as a key to identify a user. String email = payload.getEmail(); boolean emailVerified = Boolean.valueOf(payload.getEmailVerified()); String name = (String) payload.get("name"); String pictureUrl = (String) payload.get("picture"); String locale = (String) payload.get("locale"); String familyName = (String) payload.get("family_name"); String givenName = (String) payload.get("given_name");
Python
from apiclient import discovery import httplib2 from oauth2client import client # (Receive auth_code by HTTPS POST) # If this request does not have `X-Requested-With` header, this could be a CSRF if not request.headers.get('X-Requested-With'): abort(403) # Set path to the Web application client_secret_*.json file you downloaded from the # Google API Console: https://console.cloud.google.com/apis/credentials CLIENT_SECRET_FILE = '/path/to/client_secret.json' # Exchange auth code for access token, refresh token, and ID token credentials = client.credentials_from_clientsecrets_and_code( CLIENT_SECRET_FILE, ['https://www.googleapis.com/auth/drive.appdata', 'profile', 'email'], auth_code) # Call Google API http_auth = credentials.authorize(httplib2.Http()) drive_service = discovery.build('drive', 'v3', http=http_auth) appfolder = drive_service.files().get(fileId='appfolder').execute() # Get profile info from ID token userid = credentials.id_token['sub'] email = credentials.id_token['email']