¿Cómo autorizo ​​una aplicación (web o instalada) sin la intervención del usuario?

Digamos que tengo una aplicación web que necesita acceder a los archivos de Drive en un servicio en segundo plano. Poseerá los archivos a los que está accediendo o se ejecutará en una cuenta de Google con la que el propietario haya compartido los documentos.

Entiendo que mi aplicación necesita un token de actualización, pero no quiero escribir el código para obtenerlo, ya que solo lo haré alguna vez.

NÓTESE BIEN. Esto NO está usando una cuenta de servicio. La aplicación se ejecutará con una cuenta de Google convencional. No estoy diciendo que esto sea una buena idea, la Cuenta de servicio es un enfoque válido en algunas situaciones. Sin embargo, la técnica de utilizar Oauth Playground para simular la aplicación puede ahorrar un montón de esfuerzo redundante, y se aplica a cualquier API para la que no se admite compartir en una cuenta de servicio.

Esto se puede hacer con el Oauth2 Playground en https://developers.google.com/oauthplayground

Pasos:-

  1. Crear la cuenta de Google (p. Ej. My.drive.app@gmail.com)
  2. Use la consola API para registrar mydriveapp ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp o simplemente https://console.developers.google.com/apis/ )
  3. Cree un nuevo conjunto de credenciales (NB OAuth Client ID not Service Account Key y luego elija “Web Application” de la selección)
  4. Incluye https://developers.google.com/oauthplayground como un URI de redireccionamiento válido
  5. Tenga en cuenta la identificación del cliente (aplicación web) y Client Secret
  6. Inicie sesión como my.drive.app@gmail.com
  7. Ir al patio de juegos Oauth2
  8. En Configuración (icono de engranaje), configure
    • Oauth flow: servidor
    • Tipo de acceso: sin conexión
    • Use sus propias credenciales de OAuth: marque
    • Client Id y Client Secret: del paso 5
  9. Haga clic en el Paso 1 y seleccione Drive API https://www.googleapis.com/auth/drive (una vez dicho esto, esta técnica también funciona con cualquiera de las API de Google enumeradas)
  10. Haga clic en Autorizar API. Se le pedirá que elija su cuenta de Google y confirme el acceso
  11. Haga clic en Paso 2 y “Código de autorización de intercambio para tokens”
  12. Copie el token de actualización devuelto y péguelo en su aplicación, código fuente o en algún tipo de almacenamiento desde donde su aplicación pueda recuperarlo.

Ahora su aplicación se puede ejecutar sin supervisión y use el token de actualización como se describe https://developers.google.com/accounts/docs/OAuth2WebServer#offline para obtener un token de acceso.

NÓTESE BIEN. Tenga en cuenta que Google puede caducar el token de actualización, lo que significa que debe repetir los pasos 5 en adelante para obtener un nuevo token de actualización. El síntoma de esto será una subvención inválida devuelta cuando intenta utilizar el token de actualización.

NB2. Esta técnica funciona bien si desea una aplicación web que acceda a su propia (y única ) cuenta de Drive, sin molestarse en escribir el código de autorización que solo se ejecutará una vez. Simplemente omita el paso 1 y reemplace “my.drive.app” con su propia dirección de correo electrónico en el paso 5. Asegúrese de conocer las implicaciones de seguridad si el token de actualización es robado.

Vea el comentario de Woody a continuación donde se vincula a este video de Google https://www.youtube.com/watch?v=hfWe1gPCnzc

. . .

Aquí hay una rutina rápida de JavaScript que muestra cómo usar el token de actualización del patio de recreo de OAuth para enumerar algunos archivos de Drive. Simplemente puede copiarlo y pegarlo en la consola de desarrollo de Chrome o ejecutarlo con un nodo. Por supuesto, proporcione sus propias credenciales (las siguientes son falsas).

 function get_access_token_using_saved_refresh_token() { // from the oauth playground const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0"; // from the API console const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com"; // from the API console const client_secret = "WnGC6KJ91H40mg6H9r1eF9L"; // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline const refresh_url = "https://www.googleapis.com/oauth2/v4/token"; const post_body = `grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}`; let refresh_request = { body: post_body, method: "POST", headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' }) } // post to the refresh endpoint, parse the json response and use the access token to call files.list fetch(refresh_url, refresh_request).then( response => { return(response.json()); }).then( response_json => { console.log(response_json); files_list(response_json.access_token); }); } // a quick and dirty function to list some Drive files using the newly acquired access token function files_list (access_token) { const drive_url = "https://www.googleapis.com/drive/v3/files"; let drive_request = { method: "GET", headers: new Headers({ Authorization: "Bearer "+access_token }) } fetch(drive_url, drive_request).then( response => { return(response.json()); }).then( list => { console.log("Found a file called "+list.files[0].name); }); } get_access_token_using_saved_refresh_token(); 
    Intereting Posts