Следуйте этой процедуре, если вы хотите, чтобы ваши серверы могли выполнять вызовы API Google от имени пользователей или пока они находятся в автономном режиме.
Прежде чем начать
Вам необходимо выполнить базовую интеграцию входа в Google .
Включите доступ к API на стороне сервера для вашего приложения.
На странице доступа к API Google на странице приложения iOS ваше приложение проверяет подлинность пользователя только на стороне клиента; в этом случае ваше приложение сможет получить доступ к API Google только тогда, когда пользователь активно использует ваше приложение.
С помощью процедуры, описанной на этой странице, ваши серверы могут выполнять вызовы API Google от имени пользователей, когда они находятся в автономном режиме. Например, приложение для работы с фотографиями может улучшить фотографию в альбоме пользователя в Google Фото, обработав ее на внутреннем сервере и загрузив результат в другой альбом. Для этого вашему серверу требуется токен доступа и токен обновления.
Чтобы получить токен доступа и токен обновления для вашего сервера, вы можете запросить одноразовый код авторизации , который ваш сервер обменивает на эти два токена. После успешного входа вы найдете одноразовый код в свойстве serverAuthCode
объекта GIDSignInResult
.
Если вы еще этого не сделали, получите идентификатор клиента сервера и укажите его в файле
Info.plist
вашего приложения под идентификатором клиента OAuth .<key>GIDServerClientID</key>
<string>YOUR_SERVER_CLIENT_ID </string>В обратном вызове для входа получите одноразовый код авторизации:
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
guard error == nil else { return }
guard let signInResult = signInResult else { return }
let authCode = signInResult.serverAuthCode
}[GIDSignIn.sharedInstance
signInWithPresentingViewController:self
completion:^(GIDSignInResult * _Nullable signInResult,
NSError * _Nullable error) {
if (error) { return; }
if (signInResult == nil) { return; }
NSString *authCode = signInResult.serverAuthCode;
}];Безопасно передайте строку
serverAuthCode
на свой сервер с помощью HTTPS POST.На внутреннем сервере вашего приложения замените код аутентификации на токены доступа и обновления. Используйте токен доступа для вызова API Google от имени пользователя и, при необходимости, сохраните токен обновления, чтобы получить новый токен доступа по истечении срока действия токена доступа.
Например:
// (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");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']