Pedro
Intento agregar la autenticación de Google+ para el sitio de wordpress. Lo que quiero: después de la autenticación en Google+ si el usuario no está registrado en el sitio, lo redirijo a la página donde ingresa su nombre de usuario; si el usuario ya se registró, se iniciará sesión. aquí mi código js:
function doGooglePlusLogin(authResult) {
if (authResult['code']) {
jQuery('#signinButton').attr('style', 'display: none');
jQuery.ajax({
url: '<?php echo site_url(); ?>/wp-admin/admin-ajax.php',
type: 'get',
dataType: 'json',
data: {
action: 'login_gplus',
code: authResult['code']
},
success: function(result) {
},
});
} else if (authResult['error']) {
}
}
aquí mi código php:
function login_gplus() {
$response = array();
if (isset($_GET['code']) && !empty($_GET['code'])) {
@session_start();
$client = new Google_Client();
$client->setApplicationName('Test');
$client->setAccessType('offline');
$client->setClientId(get_option(SOCIAL_GPLUS_CLIENT_ID));
$client->setClientSecret(get_option(SOCIAL_GPLUS_CLIENT_SECRET));
$client->setDeveloperKey(get_option(SOCIAL_GPLUS_API_KEY));
$client->setRedirectUri(get_option(SOCIAL_GPLUS_REDIRECT_URIS));
$client->setApprovalPrompt('auto');
$code = $_GET['code'];
$client->authenticate($code);
$token = json_decode($client->getAccessToken());
$reqUrl="https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=" . $token->access_token;
$req = new Google_HttpRequest($reqUrl);
$tokenInfo = json_decode(
$client->getIo()
->authenticatedRequest($req)
->getResponseBody());
if ($tokenInfo->error) {
$response['test'] = $tokenInfo->error;
send_json_response($response);
die();
}
if ($tokenInfo->audience != get_option(SOCIAL_GPLUS_CLIENT_ID)) {
$response['test'] = "Token's client ID does not match app's.";
send_json_response($response);
die();
}
$response['test'] = 'Succesfully connected with token: ' . print_r($token, true);
}
send_json_response($response);
die();
}
Usuario autorizado con éxito en Google+ pero en php obtuve esto:
Error fatal: excepción no detectada ‘Google_AuthException’ con el mensaje ‘Error al obtener el token de acceso de OAuth2, mensaje: ‘redirect_uri_mismatch’ en /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/auth /Google_OAuth2.php:113Seguimiento de la pila:#0 /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/Google_Client.php(131): Google_OAuth2->authenticate(Array, ‘ 4/ScmpTqEIWt0SJ…’)#1 /var/www/html/v4/wp-content/plugins/social/google-plus/functions.php(35): Google_Client->authenticate(‘4/ScmpTqEIWt0SJ… ‘)#2 [internal function]: login_gplus(”)#3 /var/www/html/v4/wp-includes/plugin.php(406): call_user_func_array(‘login_gplus’, Array)#4 /var/www/html/v4/wp-admin /admin-ajax.php(74): do_action(‘wp_ajax_nopriv_…’)#5 {main} incluido en /var/www/html/v4/wp-content/plugins/social/google-plus/google-api /auth/Google_OAuth2.php en la línea 113
En la configuración de la aplicación, los URI de redirección se especifican como http://ejemplo.com/wp-admin/admin-ajax.php. ¿Qué hago mal?
EDITAR:
Definición del botón de inicio de sesión de Google+:
<span id="signinButton">
<span class="g-signin"
data-callback="doGooglePlusLogin"
data-clientid="<?php echo $this->gplus_client_id; ?>"
data-cookiepolicy="single_host_origin" data-accesstype="offline"
data-requestvisibleactions="http://schemas.google.com/AddActivity"
data-scope="https://www.googleapis.com/auth/plus.login">
</span>
</span>
SOCIAL_GPLUS_REDIRECT_URIS es example.com/wp-admin/admin-ajax.php?action=login_gplus
Su código es básicamente correcto, pero hay una pequeña peculiaridad que puedo ver que no está muy bien documentada. Debe configurar su redirectURI en postmessage en lugar de la URL que está utilizando.
$client->setRedirectUri('postmessage');
Esto es para que coincida con el URI establecido para el token durante el intercambio de Javascript desde el botón. Echa un vistazo al código de muestra en: https://github.com/googleplus/gplus-inicio-rápido-php/blob/master/signin.php para verlo en acción. Me aseguraré de agregar una nota a la documentación.
-
Gracias por tu ayuda. Me salvas.
– Pedro
28 de marzo de 2013 a las 14:16
-
¡¡¡¡DIOS MÍO!!!! Paso 8 horas investigando el código y tratando de deshacerme de esta tontería
redirect_uri_mismatch
¡error! Prueba con codificación, sin, http/https, registrando nueva aplicación, diferentes subdominios… Dios mío, acabo de ponerpostmessage
en cambio. ¡Chicos de Google, por favor documéntenlo!!!!!– Mike Keskinov
24/09/2013 a las 19:09
-
¡Gracias, me salvaste a mí también! Nada en la documentación de Google. 🙁
– Stocki
11 mayo 2014 a las 15:43
-
Genial!! He estado cavando este error durante horas.
– Buscador
24 de octubre de 2014 a las 9:49
-
Actualice la documentación en esta página (developers.google.com/+/web/signin/server-side-flow) para indicar cómo se autentica correctamente la clase Google_Client(). Tal como es, es misterioso, engañoso y desalentador.
– Ben Birney
6 de enero de 2015 a las 3:30
¿Estás usando el Botón de inicio de sesión de Google+ ¿O estás desencadenando el flujo tú mismo? Publique su código de front-end que muestre cómo se activa este flujo. Necesitamos ver los parámetros de configuración que se pasan a Google. (oculte su ID de cliente. Además, necesitamos ver en su lado PHP qué valores están presentes para su SOCIAL_GPLUS_REDIRECT_URIS
– BrettJ
27/03/2013 a las 20:59
Estoy usando el botón de inicio de sesión de Google+.
<span id="signinButton"> <span class="g-signin" data-callback="doGooglePlusLogin" data-clientid="<?php echo $this->gplus_client_id; ?>" data-cookiepolicy="single_host_origin" data-accesstype="offline" data-requestvisibleactions="http://schemas.google.com/AddActivity" data-scope="https://www.googleapis.com/auth/plus.login"> </span> </span>
– Pedro
28 de marzo de 2013 a las 8:14
SOCIAL_GPLUS_REDIRECT_URIS es ejemplo.com/wp-admin/admin-ajax.php?action=login_gplus
– Pedro
28 de marzo de 2013 a las 8:44