Alguns Serviços do Google, como o Drive, o Gmail e muitos outros, fornecem APIs públicas que podem ser usadas para criar apps que ajudam os usuários a trabalhar com os dados deles nesses serviços. Para acessar esses serviços, os apps precisam implementar um dos fluxos de cliente do OAuth 2.0 para receber o consentimento dos usuários e tokens de acesso, que concedem acesso às APIs.
Você pode usar a biblioteca do Login do Google, que implementa o fluxo do OAuth 2.0 para você, para receber tokens de acesso do usuário conectado.
Pré-requisitos
Antes que o app iOS possa chamar as APIs do Google, conclua as seguintes etapas de configuração:
1. Ativar as APIs do projeto
Qualquer aplicativo que chame as APIs do Google precisa ativá-las no console do Google Cloud.
Para ativar uma API para um projeto, faça o seguinte:
- Abra a Biblioteca de APIs no console do Google Cloud.
- Se necessário, selecione um projeto ou crie um novo.
- Selecione aquela que você quer habilitar e clique em Ativar.
2. Criar credenciais de autorização
Qualquer aplicativo iOS que use o OAuth 2.0 para acessar as APIs do Google precisa ter credenciais de autorização que identifiquem o aplicativo para o servidor de autorização do Google. As etapas a seguir explicam como criar credenciais para seu projeto:
- Acesse a página Credenciais no console do Google Cloud.
- Clique em Criar cliente (ou Criar credenciais > ID do cliente OAuth).
- Selecione iOS como o tipo de aplicativo.
- Insira um nome para o cliente OAuth. Esse nome identifica o cliente na página "Credenciais" do seu projeto.
- Insira o identificador do pacote do seu app. O ID do pacote é o valor da
chave
CFBundleIdentifiernoInfo.plistdo app. O valor geralmente é exibido no painel "Geral" ou no painel "Assinatura e recursos" do editor de projetos do Xcode ou na página de informações do app no Apple App Store Connect. Confirme se você está usando o ID do pacote correto, porque ele não poderá ser alterado se você usar o App Check. - (Opcional) Insira o ID da App Store do seu app se ele estiver publicado na App Store da Apple. O ID da loja é uma string numérica incluída em todos os URLs da App Store da Apple.
- (Opcional) Insira o ID da equipe. Consulte Localizar o ID da equipe na documentação da conta de desenvolvedor da Apple. O ID da equipe é obrigatório se você ativar o App Check para seu cliente.
- (Opcional) Ative o App Check no seu app iOS. Quando você ativa o App Check, o serviço App Attest da Apple é usado para verificar se as solicitações do OAuth 2.0 originadas do seu cliente OAuth são genuínas e vêm do seu app, ajudando a reduzir o risco de falsificação de identidade do app.
- Clique em Criar.
O ID do cliente é gerado e exibido no console do Google Cloud. Adicione o
esquema de URL do ID do cliente invertido (por exemplo,
com.googleusercontent.apps.1234567890-abcdef) ao Info.plist do app para
processar redirecionamentos de autorização.
3. Concluir a integração básica do Login do Google
Conclua a integração básica do Login do Google antes de solicitar escopos incrementais e chamar as APIs do Google.
1. Verificar quais escopos foram concedidos
Antes de fazer uma chamada para uma API do Google, verifique quais escopos já foram
concedidos ao app usando a propriedade grantedScopes de 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
}
Dependendo se um determinado escopo foi concedido ou não pelo usuário, talvez seja necessário solicitar um escopo adicional para oferecer suporte a uma interação específica.
2. Solicitar mais escopos
Se você precisar solicitar mais escopos, chame
addScopes:presentingViewController:completion ou
addScopes:presentingWindow:completion para pedir que o usuário conceda mais acesso
ao app.
Por exemplo, para solicitar acesso somente leitura aos arquivos do Drive de um usuário:
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. Fazer uma chamada de API com tokens novos
Para garantir que as chamadas de API do Google sempre tenham tokens de acesso não expirados
anexados, envolva as chamadas em um bloco 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];
}];
Use o token de acesso para chamar a API, incluindo o token de acesso no
cabeçalho de uma solicitação REST ou gRPC
(Authorization: Bearer ACCESS_TOKEN) ou usando o
autorizador de busca com a biblioteca de cliente das APIs do Google.