Saltar al contenido

gapi no está definido: problema de inicio de sesión de Google con gapi.auth2.init

Solución:

Pasa porque tienes async y defer atributos en su etiqueta de secuencia de comandos. gapi se cargaría después de su etiqueta de secuencia de comandos con gapi.auth2.init

Esperar a gapi antes de ejecutar este código, puede usar el parámetro de consulta onload en la etiqueta del script, como sigue:

<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script>
<script>
window.onLoadCallback = function(){
  gapi.auth2.init({
      client_id: 'filler_text_for_client_id.apps.googleusercontent.com'
    });
}
</script>

O en caso de que lo necesite en muchos lugares, puede usar promesas para estructurarlo mejor:

// promise that would be resolved when gapi would be loaded
var gapiPromise = (function(){
  var deferred = $.Deferred();
  window.onLoadCallback = function(){
    deferred.resolve(gapi);
  };
  return deferred.promise()
}());

var authInited = gapiPromise.then(function(){
  gapi.auth2.init({
      client_id: 'filler_text_for_client_id.apps.googleusercontent.com'
    });
})


$('#btn').click(function(){
  gapiPromise.then(function(){
    // will be executed after gapi is loaded
  });

  authInited.then(function(){
    // will be executed after gapi is loaded, and gapi.auth2.init was called
  });
});

Creo que con el ejemplo anterior encontrará que esto tampoco funcionará, ya que gapi.auth2 aún no se definirá (lo sé porque cometí el mismo error hoy) Primero debes llamar gapi.load('auth2', callback) y pasar ESO una devolución de llamada que luego llama gapi.auth2.init. Aquí hay un ejemplo de mi _onGoogleLoad función, que es la devolución de llamada para cargar la primera platform.js texto.

var _auth2

var _onGoogleLoad = function () {
  gapi.load('auth2', function () {
    _auth2 = gapi.auth2.init({
      client_id: 'OUR_REAL_ID_GOES_HERE',
      scope: 'email',
      fetch_basic_profile: false
    })
    _enableGoogleButton()
  })
}

Después de eso, puede usar el _auth2 variable para iniciar sesión en los usuarios.

El problema no está solo en gapi. Llamar init método: el objeto auth2 debe inicializarse. Hay una promesa una vez que un objeto de autenticación de Google está completamente inicializado GoogleAuth.then(onInit, onFailure)

gapi.load('auth2', initSigninV2);

function initSigninV2() {
    gapi.auth2.init({
        client_id: 'CLIENT_ID.apps.googleusercontent.com'
    }).then(function (authInstance) {
        // now auth2 is fully initialized
    });
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *