integrar google funciona con como cliente login google-api oauth-2.0

funciona - oauth login google



¿Cómo identificar a un usuario de Google OAuth2? (6)

"¿Quien es este?" es esencialmente un servicio; debe solicitar acceso como ámbito y luego realizar una solicitud al servidor de recursos de perfil de Google para obtener la identidad. Ver OAuth 2.0 para ingresar para más detalles.

Utilicé el inicio de sesión de Facebook para identificar a los usuarios. Cuando llega un nuevo usuario, guardo su ID de usuario en mi base de datos. La próxima vez que vienen, reconocí su identificación de Facebook y sé qué usuario es en mi base de datos.

Ahora trato de hacer lo mismo con Google OAuth2, pero ¿cómo puedo reconocer a los usuarios?

Google me envía varios códigos y tokens (access_token, id_token, refresh_token), sin embargo, ninguno de ellos es constante. Es decir, si cierro la sesión y vuelvo a iniciar sesión 2 minutos después, los 3 valores han cambiado. ¿Cómo puedo identificar al usuario de forma única?

Estoy usando su biblioteca cliente de PHP: https://code.google.com/p/google-api-php-client/



A pesar de que los JWT se pueden validar localmente con la clave pública (las descargas de la Biblioteca de clientes de las API de Google y las almacena en caché automáticamente), es necesario marcar el token de Google a través del https://www.googleapis.com/oauth2/v1/tokeninfo endpoint para verificar si el acceso para la aplicación ha sido revocado desde la creación del token.


Cabe mencionar que la API de OpenID Connect ya no devuelve ningún atributo de id .

Ahora es el atributo sub que sirve como una identificación de usuario única.

Ver Google Dev OpenID Connect UserInfo


Inserté este método en google-api-php-client / src / apiClient.php:

public function getUserInfo() { $req = new apiHttpRequest(''https://www.googleapis.com/oauth2/v1/userinfo''); // XXX error handling missing, this is just a rough draft $req = $this->auth->sign($req); $resp = $this->io->makeRequest($req)->getResponseBody(); return json_decode($resp, 1); }

Ahora puedo llamar:

$client->setAccessToken($_SESSION[ ''token'' ]); $userinfo = $client->getUserInfo();

Devuelve una matriz como esta (más el correo electrónico si se ha solicitado ese alcance):

Array ( [id] => 1045636599999999999 [name] => Tim Strehle [given_name] => Tim [family_name] => Strehle [locale] => de )

La solución se originó en este hilo: https://groups.google.com/forum/#!msg/google-api-php-client/o1BRsQ9NvUQ/xa532MxegFIJ


Como han mencionado otros, puede enviar un GET a https://www.googleapis.com/oauth2/v1/userinfo , utilizando el token de portador OAuth2 que acaba de recibir, y obtendrá una respuesta con cierta información sobre el usuario (id. , nombre, etc.).

También vale la pena mencionar que Google implementa OpenID Connect y que este punto final de información del usuario es solo una parte de él.

OpenID Connect es una capa de autenticación sobre OAuth2. Al intercambiar un code autorización en el punto final del token de Google, se obtiene un token de acceso (el parámetro access_token ) y un token de ID de OpenID Connect (el parámetro id_token ).

Ambos tokens son JWT (JSON Web Token, http://tools.ietf.org/html/draft-ietf-oauth-json-web-token ).

Si los decodifica, obtendrá algunas afirmaciones, incluida la identificación del usuario. Si vincula este ID a un usuario en su base de datos, puede identificarlos inmediatamente sin tener que hacer una GET extra de userinfo (ahorra tiempo).

Como se mencionó en los comentarios, estos tokens están firmados con la clave privada de Google y es posible que desee verificar la firma mediante la clave pública de Google ( https://www.googleapis.com/oauth2/v1/certs ) para asegurarse de que sean auténticos.

Puede ver lo que hay en un JWT pegándolo en https://jwt.io/ (desplácese hacia abajo para el depurador JWT). Las afirmaciones se ven algo así como:

{ "iss":"accounts.google.com", "id":"1625346125341653", "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com", "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com", "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA", "iat":1567923785, "exp":1350926995 }

También hay bibliotecas para varios lenguajes de programación para decodificar programáticamente JWT.