php - Google Calendar API v3: autenticar con credenciales codificadas
google-api google-api-php-client (3)
Estoy escribiendo una aplicación PHP que debe permitir a los usuarios agregar ciertos eventos a un calendario privado de Google. El calendario es de mi propiedad y necesito una forma de que PHP se comunique con la API del calendario mediante credenciales fijas (todos pueden agregar eventos mediante un formulario en el sitio web, pero el calendario en sí no es visible públicamente).
Por lo que he leído, esto es posible utilizando ClientLogin en la API v1. En la API v3, sin embargo, las opciones disponibles son OAuth2.0 o la clave API. El uso de la clave API no parece funcionar, ya que solo se puede usar para solicitudes que no requieren autorización, y OAuth tampoco parece correcto, ya que los usuarios no deben acceder a sus propios calendarios, sino a mi Usos de la aplicación.
Pensé en obtener el token de OAuth programáticamente, pero es probable que se rompa tarde o temprano, ya que el cuadro de diálogo OAuth puede utilizar captchas.
Este parece ser un caso de uso tan estándar, una aplicación web que permite a los usuarios interactuar con un solo calendario de alguna manera predefinida. Sin embargo, no puedo encontrar ninguna documentación sobre cómo hacer que suceda en la API v3. ¿Alguien puede ayudarme?
Deberá usar la clave de desarrollador (clave de API) y OAuth2. La clave del desarrollador autentica quién escribió el software y se usa para cosas como la cuota que se establece por desarrollador y no por usuario. OAuth2 es para la autenticación del usuario y será necesario acceder al calendario no público.
OAuth2 tiene un token renovado desde el cual puede generar un token de sesión y esto significa que no necesitará raspar las pantallas de OAuth para autenticarse. Para obtener esto, escribiría una pequeña aplicación de línea de comandos, o usaría una página única de PHP.
- Bajo la consola de Google Api vaya a API Access
- Genere un nuevo ID de cliente y elija la aplicación instalada (ya que autentificará su servidor y no como usuario)
- Ya sea mediante una aplicación de consola o una página de PHP autenticada con OAuth y su cuenta de Google (la que tiene el calendario al que desea acceder)
- En el retorno de la autenticación debe haber un token de renovación, (llamado renovar o actualizar o algo similar). Guarda esta cadena y ponla a disposición de tu sitio PHP.
- Cuando necesite acceder al servicio, su biblioteca OAuth debe tener una llamada de renovación / actualización. Hay un ejemplo usando .Net a continuación.
private IAuthorizationState CreateAuthorization(NativeApplicationClient arg)
{
// Get the auth URL:
IAuthorizationState state = new AuthorizationState(new[] { AdsenseService.Scopes.AdsenseReadonly.GetStringValue() });
state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
if (refreshToken.IsNotNullOrEmpty()) // refreshToken you stored in step 4
{
try
{
state.RefreshToken = refreshToken;
if (arg.RefreshToken(state)) // This is calling out to the OAuth servers with the refresh token getting back a session token, returns true if successful.
{
if (state.RefreshToken != refreshToken) // if the refresh token has changed, save it.
{
PersistRefreshToken(authorization.RefreshToken);
}
return this.authorization = state; // Retain the authorization state, this is what will authenticate your calls.
}
}
catch (ProtocolException ex) {...}
El AuthorisationState que ahora se ha renovado se puede usar para autenticar las llamadas que realice a la API. este estado se puede utilizar muchas veces hasta que caduque y luego se puede actualizar. Como está autentificando su aplicación como usted mismo, no como usuario, este AuthorisationState puede ser compartido por todas sus sesiones. Tanto el AuthorisationState actual como el token de actualización deben mantenerse de manera segura en su servidor y nunca enviarse al cliente, si alguna vez los envió como parte de una respuesta, sus clientes tendrían los mismos privilegios que su aplicación de código
He encontrado una solución que creo que es "el oficial" para lo que quiere hacer.
Primero, debe activar una API de Google "ID de cliente para aplicaciones instaladas".
Ve a la consola de Google API y crea el proyecto.
Luego, activa el calendario.
Vaya a la opción "Acceso API" y use el botón "Crear cliente OAuth 2.0".
Asigne un nombre (y un logotipo, si lo desea) al producto. Haga clic en Siguiente".
Elija la opción "Aplicación instalada" y haga clic en "Crear ID de cliente".
Ahora tienes tu acceso configurado. Ahora, necesitarás algunos códigos. Para obtenerlos:
* El "Código de autenticación". Para conseguirlo, necesitas la siguiente información:
ALCANCE: https://www.google.com/calendar/feeds/ (si desea acceder al calendario API. Hay otros que puede encontrar en OAuth 2.0 Playground)
CLIENTE_ID: Lo encontrarás en la sección de Acceso a API en la Consola de API de Google.
REDIRECT_URI: Consíguelo en el mismo lugar.
Ahora, copie el siguiente código en un archivo, ponga los valores en las variables, ejecute el código (php -q script_name.php) y vaya a la URL impresa.
<?php
$scope = '''';
$client_id = '''';
$redirect_uri = '''';
$params = array(
''response_type'' => ''code'',
''client_id'' => $client_id,
''redirect_uri'' => $redirect_uri,
''scope'' => $scope
);
$url = ''https://accounts.google.com/o/oauth2/auth?'' . http_build_query($params);
echo $url."/n";
?>
La página web le pedirá que permita el acceso. Hazlo y obtendrás un código, que es tu código de autenticación.
* El "Código de actualización". Para conseguirlo, necesitarás:
Los datos que utilizó anteriormente, más el código "secreto del cliente" en la Consola de API, entre la "identificación del cliente" y el "URI de redirección".
Como lo hizo antes, copie el siguiente código y coloque las variables en su lugar (el campo de código es el Código de autenticación). Ejecutar y el resultado es el "Token de actualización".
<?php
$url = ''https://accounts.google.com/o/oauth2/token'';
$post_data = array(
''code'' => '''',
''client_id'' => '''',
''client_secret'' => '''',
''redirect_uri'' => '''',
''grant_type'' => ''authorization_code'',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$token = json_decode($result);
echo $token->refresh_token . "/n";
?>
En este momento, tienes todo lo que necesitas. Tenga cuidado si algún día cambia el código de autenticación. Tendrás que conseguir nuevas llaves.
Para acceder a un servicio de calendario, aquí tiene el ejemplo: Cambie los valores de las variables antes de usarlo. Este ejemplo obtiene los eventos de calendario principales, pero puede cambiar la dirección de cualquier API del calendario ( http://code.google.com/intl/ca/apis/calendar/v3/getting_started.html#background_operations )
<?php
$scope = ''https://www.google.com/calendar/feeds/'';
$client_id = '''';
$client_secret = '''';
$redirect_uri = '''';
$refresh_token = '''';
$token_url = ''https://accounts.google.com/o/oauth2/token'';
$post_data = array(
''client_secret'' => $client_secret,
''grant_type'' => ''refresh_token'',
''refresh_token'' => $refresh_token,
''client_id'' => $client_id
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $token_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$token_object = json_decode($result);
$access_token = $token_object->access_token;
// Get the results
$rest_url = ''https://www.googleapis.com/calendar/v3/calendars/primary/events'';
$header = "Authorization: OAuth " . $access_token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
curl_setopt($ch, CURLOPT_URL, $rest_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$rest_result = curl_exec($ch);
print_r(json_decode($rest_result));
?>
Primero, el script solicita un "Token de acceso", que es válido por una hora. Luego, el script obtiene el servicio REST (cualquiera en el ámbito del calendario), enviando el token de acceso en el encabezado. Para obtener una mejor velocidad en el script, sería bueno almacenar el token de acceso en un caché hasta que tenga más de 3600 segundos. De esta manera, el script evitaría una de las dos llamadas.
Consejos:
Visite OAuth 2.0 Playground para comprender toda la información enviada en el proceso de OAuth. Me ayudó mucho
Una publicación de Eric Nagel en su blog me dio la solución. Todo el mérito es para él. No puedo vincularlo ya que no tengo suficiente "reputación".
También se puede utilizar con la biblioteca de php de Google. El token de acceso para la función $client->setAccessToken()
debe formatearse de la siguiente manera:
$at= ''{"access_token":"'' . $access_token . ''",'' .
''"token_type":"Bearer",'' .
''"expires_in":3600,'' .
''"refresh_token":"'' . $refresh_token . ''",'',
''"created":'' . time() . ''}'';
Donde $access_token
es el token de acceso encontrado por usted y $refresh_token
es el token de actualización. Probado con el inútil ejemplo de google simple.php.
La autenticación es entonces sólo:
$client->setAccessToken($at);