Aviso: esta página é sobre as APIs mais antigas do Google, as APIs Google Data. Ela é relevante apenas para as APIs listadas no diretório de APIs Google Data, muitas das quais foram substituídas por APIs mais recentes. Para informações sobre uma nova API específica, consulte a documentação dela. Para informações sobre como autorizar solicitações com uma API mais recente, consulte Autenticação e autorização de contas do Google.
Este documento descreve como usar as bibliotecas de cliente da API Google Data para se conectar à autenticação AuthSub para aplicativos da Web do Google.
A interface AuthSub permite que um aplicativo baseado na Web acesse um serviço do Google em nome de um usuário. Para manter um alto nível de segurança, a interface AuthSub permite que o aplicativo receba um token de autenticação sem nunca processar as informações de login da conta do usuário.
As bibliotecas de cliente da API Google Data oferecem métodos para ajudar você a usar o AuthSub no seu aplicativo da Web. Especificamente, há métodos para construir o URL da solicitação, adquirir um token de autenticação de uso único, trocar o token de uso único por um token de sessão e assinar a solicitação.
Observação: a biblioteca de cliente JavaScript tem uma versão própria do AuthSub, chamada AuthSubJS. Para informações sobre como usar o AuthSubJS em aplicativos JavaScript, consulte Usar a autenticação "AuthSub" com a biblioteca de cliente JavaScript.
Público-alvo
Este documento é destinado a programadores que querem que os aplicativos baseados na Web acessem os serviços do Google em nome dos usuários, usando as bibliotecas de cliente das APIs de dados do Google.
Este documento pressupõe que você conhece a interface AuthSub e o processo geral para incorporar o AuthSub ao seu aplicativo da Web. Para uma descrição completa do protocolo do AuthSub, consulte Autenticação do AuthSub para aplicativos da Web.
Como usar o AuthSub e as APIs de dados do Google sem as bibliotecas de cliente
Se você quiser que o cliente do aplicativo da Web interaja com um serviço de dados do Google usando o AuthSub como um sistema de autenticação, tudo o que você precisa saber está em Autenticação do AuthSub para aplicativos da Web. Não é necessário usar as bibliotecas de cliente das APIs Google Data se você não quiser.
Confira um resumo de como seu aplicativo pode autenticar um usuário usando o AuthSub:
O aplicativo cria o URL AuthSub apropriado e envia o usuário para ele para que ele possa fazer login. O sistema AuthSub envia o usuário de volta para o URL especificado no seu site e retorna um token de uso único. O aplicativo pode trocar esse token por um token de sessão. Em seguida, o aplicativo envia o token no cabeçalho de autorização com cada solicitação enviada ao serviço.
As bibliotecas de cliente das APIs de dados do Google simplificam esse processo de autorização ao processar vários detalhes para você. Este documento explica como fazer isso.
Como trabalhar com AuthSub e as APIs de dados do Google: exemplos de bibliotecas de cliente
Esta seção mostra um exemplo de como usar os métodos da biblioteca de cliente das APIs de dados do Google para seguir as etapas descritas na seção "Como trabalhar com o AuthSub" da documentação do AuthSub.
Neste exemplo, estamos integrando a interface AuthSub a um aplicativo da Web que interage com o Google Agenda. No entanto, não é necessário saber nada sobre o Google Agenda para seguir o exemplo. O exemplo pressupõe que o aplicativo da Web esteja hospedado em example.com.
Decida qual tipo de token usar (session=0 ou session=1).
Você pode usar tokens de uso único (session=0) ou de sessão (session=1).
Este documento usa tokens de sessão, já que eles são mais úteis em aplicativos que fazem várias solicitações de API.
Conforme discutido na documentação do AuthSub, se você decidir usar tokens de sessão no seu aplicativo da Web, precisará gerenciar o armazenamento de tokens por conta própria. Este documento não aborda o gerenciamento de tokens. Além disso, os tokens solicitados com session=0
não podem ser trocados (atualizados) posteriormente por um token de sessão de longa duração.
Decidir se você quer registrar seu aplicativo da Web (secure=0 ou secure=1)
O AuthSub pode ser usado em três modos diferentes: não registrado, registrado e registrado com segurança aprimorada. O restante deste documento vai se referir à última opção como AuthSub seguro. Embora o modo não registrado/registrado seja mais simples de configurar do que o AuthSub seguro, o Google recomenda que você use tokens seguros para aumentar a segurança.
Como se cadastrar
Ao escolher Registro para aplicativos baseados na Web, seu aplicativo tem os seguintes benefícios:
- Um nível mais alto de segurança.
- Ser confiável para o Google (nenhum aviso é exibido ao usuário na página de autorização do Google).
AuthSub registrado e seguro
Se você decidir usar o AuthSub seguro, será necessário criar um par de chaves privada RSA autoassinada e certificado público, além de registrar seu aplicativo da Web. Consulte Gerar chaves e certificados para uso com o modo registrado (abaixo) para exemplos de como criar certificados X.509.
Determinar o escopo do acesso aos dados
Cada Serviço do Google define um valor de scope que determina (e possivelmente restringe) o acesso de um token aos dados do usuário.
Consulte as perguntas frequentes para ver a lista de valores scope disponíveis.
Como decidimos interagir com a API Google Calendar, o scope precisa ser http://www.google.com/calendar/feeds/.
Observação: sempre defina o valor do escopo como o URL mais amplo possível, a menos que você precise de uma restrição mais refinada.
Por exemplo, um escopo mais restrito, como scope=http://www.google.com/calendar/feeds/default/allcalendars/full, limita o acesso do token
apenas ao feed allcalendars/full. Usar scope=http://www.google.com/calendar/feeds/ permite o acesso a todos os feeds do Google Agenda: http://www.google.com/calendar/feeds/*.
Tokens com vários escopos
Para criar tokens que acessam várias APIs de dados do Google, separe cada escopo com um espaço codificado por URL. O exemplo abaixo cria um token que terá acesso aos dados do Google Agenda e do Google Contatos de um usuário.
scope=http://www.google.com/calendar/feeds/%20http://www.google.com/m8/feeds/
Solicitar um token de autenticação de uso único
Para adquirir um token do AuthSub para um determinado usuário e serviço, seu aplicativo precisa redirecionar o usuário para o URL AuthSubRequest, que solicita que ele faça login na Conta do Google.
Para mais informações sobre o URL AuthSubRequest, consulte a autenticação AuthSub para aplicativos da Web completa.
Para criar o URL AuthSubRequest no seu aplicativo, use o seguinte para cada biblioteca de cliente:
Java
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request secure AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Se você quiser autenticar usuários no seu domínio do G Suite:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
.NET
using Google.GData.Client; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Se você quiser autenticar usuários no seu domínio do G Suite:
using Google.GData.Client; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
PHP
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session);
Se você quiser autenticar usuários no seu domínio do G Suite:
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $hostedDomain = 'example.com'; $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session) . '&hd=' . $hostedDomain;
Python
import gdata.auth next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session)
Se você quiser autenticar usuários no seu domínio do G Suite:
import gdata.auth hosted_domain = 'example.com' next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session, domain=hosted_domain)
Depois de criar o URL "next", o aplicativo pode usá-lo de várias maneiras para enviar o usuário ao manipulador
AuthSubRequest. A abordagem mais comum é mostrar uma página que informa ao usuário que ele precisa seguir um link para
autorizar o aplicativo a acessar a Conta do Google e anexar o URL da solicitação ao link. Por exemplo, você pode gerar a seguinte string no seu app da Web:
String authorizationUrl =
"<p>MyApp needs access to your Google Calendar account to read your Calendar feed. " +
"To authorize MyApp to access your account, <a href=\"" + authSubUrl + "\">log in to your account</a>.</p>";O usuário segue o link para a página do AuthSub no Google e faz login. Em seguida, o sistema AuthSub redireciona o usuário de volta ao aplicativo usando o URL "next" fornecido.
Extrair o token de uso único
Quando o Google redireciona de volta para seu aplicativo, o token é anexado ao URL "next" como um parâmetro de consulta. No caso dos exemplos
acima, depois que o usuário faz login, o Google redireciona para um URL como http://www.example.com/RetrieveToken?token=DQAADKEDE.
O aplicativo precisa extrair o valor do token do parâmetro de consulta do URL.
Se o aplicativo tiver definido um cookie de autenticação no navegador do usuário antes de enviá-lo ao sistema AuthSub, quando o Google redirecionar de volta para o URL "next", o aplicativo poderá ler o cookie de autenticação para reconhecer qual usuário chegou a esse URL. Você pode usar um cookie para associar um ID de usuário no seu aplicativo ao token do AuthSub recuperado do Google.
As bibliotecas de cliente fornecem métodos convenientes para extrair o token de uso único:
Java
String singleUseToken = AuthSubUtil.getTokenFromReply(httpServletRequest.getQueryString());
.NET
String singleUseToken = Request.QueryString["token"]; // or String singleUseToken = AuthSubUtil.getTokenFromReply(new Uri(Request.QueryString));
PHP
$singleUseToken = $_GET['token'];Python
current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url)
Se você estiver usando o AuthSub seguro, defina sua chave privada RSA para que um SecureAuthSubToken seja criado:
f = open('/path/to/yourRSAPrivateKey.pem') rsa_key = f.read() f.close() current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url, rsa_key=rsa_key)
Solicitar um token de sessão
O token recuperado do URL é sempre de uso único. A próxima etapa é fazer upgrade desse token para um token de sessão de longa duração usando o URL AuthSubSessionToken, conforme descrito
na documentação completa Autenticação AuthSub para aplicativos da Web. Se você estiver usando o AuthSub seguro, defina sua chave privada RSA antes
de fazer a troca. Confira alguns exemplos usando cada uma das bibliotecas de cliente:
Java
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, null); // ready to interact with Calendar feeds
Para o AuthSub seguro, transmita sua chave privada RSA para exchangeForSessionToken em vez de null:
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; java.security.PrivateKey privateKey = AuthSubUtil.getPrivateKeyFromKeystore("AuthSubExample.jks", "privKeyPa$$word", "AuthSubExample", "privKeyPa$$word"); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, privateKey); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, privateKey); // ready to interact with Calendar feeds
.NET
using Google.GData.Client; using Google.GData.Calendar; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
Para o AuthSub seguro, transmita sua chave privada RSA para exchangeForSessionToken em vez de null:
using Google.GData.Client; using Google.GData.Calendar; protected AsymmetricAlgorithm getRsaKey() { X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx", "privKeyPa$$word"); RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider; return privateKey; } AsymmetricAlgorithm rsaKey = getRsaKey(); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, rsaKey).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; authFactory.PrivateKey = rsaKey; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
PHP
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken); // Create a Calendar service object and set the session token for subsequent requests $calendarService = new Zend_Gdata_Calendar(null, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
Para o AuthSub seguro, a troca exige que você primeiro configure um Zend_Gdata_HttpClient e defina sua chave privada RSA usando setAuthSubPrivateKeyFile():
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $client = new Zend_Gdata_HttpClient(); $client->setAuthSubPrivateKeyFile('/path/to/myrsakey.pem', null, true); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken, $client); $calendarService = new Zend_Gdata_Calendar($client, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
Python
import gdata.calendar import gdata.calendar.service calendar_service = gdata.calendar.service.CalendarService() calendar_service.UpgradeToSessionToken(single_use_token) # calls gdata.service.SetAuthSubToken() for you # ready to interact with Calendar feeds
Observação: o processo é o mesmo para o AuthSub seguro, desde que você tenha usado
gdata.auth.extract_auth_sub_token_from_url(url, rsa_key=rsa_key)
para extrair o token de uso único.
Observação: ao usar o AuthSub seguro, sua chave privada não é enviada pela rede. As bibliotecas de cliente enviam a assinatura exclusiva gerada ao assinar a solicitação com sua chave, não a chave em si.
Usar o token de sessão
Você pode usar o token de sessão para autenticar solicitações ao servidor colocando o token no cabeçalho de autorização, conforme descrito na documentação do AuthSub.
Depois de definir o token de sessão, você pode usar as chamadas padrão da biblioteca de cliente das APIs de dados do Google para interagir com o serviço, sem precisar pensar no token. Para mais detalhes, consulte a documentação da biblioteca de cliente e o guia do desenvolvedor das APIs de dados do Google para o serviço e a linguagem com que você está interagindo.
Como recuperar informações sobre um token de sessão
Se você quiser testar se o cliente e o servidor concordam com os parâmetros do token, transmita o token para o manipulador
AuthSubTokenInfo, que retorna um conjunto de pares nome-valor com informações sobre o token.
Java
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, null);
Se você estiver usando o AuthSub seguro, transmita sua chave privada RSA:
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, privateKey);
.NET
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, null);
Se você estiver usando o AuthSub seguro, transmita sua chave privada RSA:
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, privateKey);
PHP
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken);Se você estiver usando o AuthSub seguro, transmita seu Zend_Gdata_HttpClient para que a solicitação seja assinada com sua chave privada RSA:
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken, $client);Python
token_info = calendar_service.AuthSubTokenInfo()
Revogar um token de sessão
Os tokens de sessão do AuthSub não expiram. Seu cliente pode armazenar o token de sessão pelo tempo necessário.
Portanto, quando o cliente terminar de usar o token de sessão, ele poderá revogar o token usando o manipulador AuthSubRevokeToken, conforme descrito na documentação do AuthSub.
Por exemplo, se você quiser gerenciar tokens de maneira tradicional, como uma sessão, o cliente poderá receber um token no início da sessão de um usuário e revogá-lo no final.
Para revogar um token, use o seguinte em cada biblioteca de cliente:
Java
AuthSubUtil.revokeToken(sessionToken, null);
Se você estiver usando o AuthSub seguro, transmita sua chave privada RSA:
AuthSubUtil.revokeToken(sessionToken, privateKey);
.NET
AuthSubUtil.revokeToken(sessionToken, null);
Se você estiver usando o AuthSub seguro, transmita sua chave privada RSA:
AuthSubUtil.revokeToken(sessionToken, privateKey);
PHP
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken);Se você estiver usando o AuthSub seguro, transmita seu Zend_Gdata_HttpClient para que a solicitação seja assinada com sua chave privada RSA:
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken, $client);Python
calendar_service.RevokeAuthSubToken()
Outros recursos e exemplos
- Exemplos do AuthSub no blog de dicas da API Google Data (em inglês)
- Exemplo de AuthSub da biblioteca de cliente Python
- Exemplo do AuthSub da biblioteca de cliente Java
- Artigo: Como usar o AuthSub com a biblioteca de cliente .NET
- Artigo: Como usar a autenticação "AuthSub" com a biblioteca de cliente JavaScript
Como gerar uma chave privada e um certificado público autoassinados para uso com o AuthSub seguro
A chave privada é usada para gerar uma assinatura, que precisa ser incluída em cada solicitação. A chave pública incorporada no certificado é usada pelo Google para verificar a assinatura. A chave pública precisa ser uma chave RSA de 1024 bits codificada em um certificado X.509 no formato PEM. O certificado precisa ser enviado ao Google no momento do registro.
As seções a seguir fornecem exemplos de como gerar chaves e certificados usando duas ferramentas específicas: o utilitário OpenSSL e o utilitário keytool do Java.
Esses exemplos não são específicos das APIs Google Data. Você pode usar os mesmos utilitários para gerar chaves para qualquer finalidade.
Os exemplos pressupõem que sua empresa se chama My_Company e está localizada em Mountain View, Califórnia, EUA, com o nome de domínio example.com.
Gerar chaves usando o OpenSSL
Para criar um par de chaves RSA e o certificado correspondente, use o seguinte comando:
# Generate the RSA keys and certificate openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \ '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \ myrsakey.pem -out /tmp/myrsacert.pem
Aviso: incluir o parâmetro -nodes cria uma chave privada sem uma senha para protegê-la.
No entanto, considere omitir esse parâmetro para aumentar a segurança.
O parâmetro -sha1 especifica que a chave será usada para gerar assinaturas SHA1.
O parâmetro -subj especifica a identidade do aplicativo que o certificado representa.
O parâmetro -keyout especifica o arquivo que vai conter as chaves.
Esse arquivo contém informações sensíveis e precisa ser protegido e não compartilhado com ninguém.
O parâmetro -out especifica o arquivo que vai conter o certificado no formato PEM
(que pode ser enviado ao Google durante o registro).
Como gerar chaves para o cliente .NET
O .NET Framework não entende chaves ou certificados armazenados no formato PEM. Portanto, é necessário realizar uma etapa extra depois de criar o arquivo .pem:
openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"
Esta etapa gera um arquivo PFX da sua chave privada e do certificado. Esse arquivo pode ser importado para a biblioteca de cliente .NET para assinar digitalmente as solicitações feitas às APIs de dados do Google.
Como gerar chaves para o cliente Java
O cliente Java aceita chaves privadas no formato PKCS#8. Depois de gerar uma chave/certificado usando as instruções acima, crie um arquivo .pk8 com o arquivo .pem gerado:
openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8
Como alternativa, use o keystore do Java e o utilitário keytool para criar um par de chaves RSA e o certificado correspondente. Use o comando a seguir:
# Generate the RSA keys and certificate keytool -genkey -v -alias Example -keystore ./Example.jks\ -keyalg RSA -sigalg SHA1withRSA\ -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain View, ST=CA, C=US"\ -storepass changeme -keypass changeme
Atenção: "changeme" não é uma boa senha. Este é apenas um exemplo.
O parâmetro -dname especifica a identidade do aplicativo que o certificado representa. O parâmetro -storepass especifica a senha para proteger o keystore. O parâmetro -keypass especifica a senha para proteger a chave privada.
Para gravar o certificado em um arquivo que pode ser usado na ferramenta ManageDomains, use o seguinte comando:
# Output the public certificate to a file keytool -export -rfc -keystore ./Example.jks -storepass changeme \ -alias Example -file mycert.pem