web-services - tienes - oauth2 google
¿Cómo puedo verificar un token de acceso a la API de autenticación de Google? (11)
¿Cómo puedo verificar un token de acceso de autenticación de Google?
Necesito de alguna manera consultar a Google y preguntar: ¿Es [token de acceso dado] válido para la cuenta de Google [[email protected]]?
Versión corta :
Está claro cómo se puede usar un token de acceso suministrado a través de la Autenticación de Google Autenticación Api :: OAuth para aplicaciones web para solicitar datos de una gama de servicios de Google. No está claro cómo verificar si un token de acceso dado es válido para una cuenta de Google determinada. Me gustaría saber cómo.
Versión larga
Estoy desarrollando una API que usa autenticación basada en tokens. Se devolverá un token con la provisión de un nombre de usuario válido + contraseña o con la provisión de un token de terceros de cualquiera de los N servicios verificables.
Uno de los servicios de terceros será Google, que permite a un usuario autenticarse contra mi servicio utilizando su cuenta de Google. Esto se ampliará más adelante para incluir cuentas de Yahoo, proveedores confiables de OpenID, etc.
Ejemplo esquemático de acceso basado en Google:
texto alternativo http://webignition.net/images/figures/auth_figure002.png
La entidad ''API'' está bajo mi control total. La entidad de ''interfaz pública'' es cualquier aplicación basada en web o escritorio. Algunas interfaces públicas están bajo mi control, otras no y otras todavía no las conozco.
Por lo tanto, no puedo confiar en el token suministrado a la API en el paso 3. Esto se proporcionará junto con la dirección de correo electrónico de la cuenta de Google correspondiente.
Necesito de alguna manera consultar a Google y preguntar: ¿Es este token de acceso válido para [email protected] ?
En este caso, [email protected] es el identificador único de la cuenta de Google: la dirección de correo electrónico que alguien usa para iniciar sesión en su cuenta de Google. No puede suponerse que es una dirección de Gmail: alguien puede tener una cuenta de Google sin tener una cuenta de Gmail.
La documentación de Google establece claramente cómo, con un token de acceso, se pueden recuperar datos de una serie de servicios de Google. Nada parece indicar cómo puede verificar si un token de acceso dado es válido en primer lugar.
Actualizar El token es válido para N servicios de Google. No puedo probar un token contra un servicio de Google para verificarlo, ya que no sabré qué subconjunto de todos los servicios de Google utiliza realmente un usuario determinado.
Además, nunca utilizaré el token de acceso de autenticación de Google para acceder a los servicios de Google, simplemente como un medio para verificar que un supuesto usuario de Google sea quien dicen ser. Si hay otra forma de hacerlo, estoy feliz de intentarlo.
Necesito de alguna manera consultar a Google y preguntar: ¿Es este token de acceso válido para [email protected]?
No. Todo lo que necesita es solicitar el inicio de sesión estándar con el inicio de sesión federado para usuarios de cuentas de Google desde su dominio de API. Y solo después de eso, puede comparar "ID de usuario persistente" con uno que tiene desde "interfaz pública".
El valor del reino se usa en la página de inicio de sesión de Google Federated para identificar el sitio solicitante para el usuario. También se usa para determinar el valor de la identificación de usuario persistente devuelta por Google.
Entonces debes ser del mismo dominio que ''interfaz pública''.
Y no olvide que el usuario debe asegurarse de que su API sea confiable;) Entonces Google le preguntará al usuario si le permite verificar su identidad.
Aquí hay un ejemplo usando Guzzle :
/**
* @param string $accessToken JSON-encoded access token as returned by /Google_Client->getAccessToken() or raw access token
* @return array|false False if token is invalid or array in the form
*
* array (
* ''issued_to'' => ''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'',
* ''audience'' => ''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'',
* ''scope'' => ''https://www.googleapis.com/auth/calendar'',
* ''expires_in'' => 3350,
* ''access_type'' => ''offline'',
* )
*/
public static function tokenInfo($accessToken) {
if(!strlen($accessToken)) {
return false;
}
if($accessToken[0] === ''{'') {
$accessToken = json_decode($accessToken)->access_token;
}
$guzzle = new /GuzzleHttp/Client();
try {
$resp = $guzzle->get(''https://www.googleapis.com/oauth2/v1/tokeninfo'', [
''query'' => [''access_token'' => $accessToken],
]);
} catch(ClientException $ex) {
return false;
}
return $resp->json();
}
Google nunca podría responder su pregunta, porque no es "¿es válido este token de acceso?" Es token + secreto.
Intenta hacer una solicitud válida y busca una respuesta de token no válida.
Intente realizar una solicitud autenticada mediante OAuth con su token en https://www.google.com/accounts/AuthSubTokenInfo . Esto solo está documentado para que funcione con AuthSub, pero también funciona para OAuth. No le indicará para qué usuario es el token, pero le indicará para qué servicios es válido y la solicitud fallará si el token no es válido o si ha sido revocado.
No se puede usar un token de acceso OAuth arbitrario para la autenticación, ya que el significado del token está fuera de las especificaciones de OAuth Core. Podría estar destinado a un solo uso o ventana de vencimiento estrecho, o podría proporcionar acceso que el usuario no desea dar. También es opaco y es posible que el consumidor de OAuth que lo obtuvo nunca haya visto ningún tipo de identificador de usuario.
Un proveedor de servicios de OAuth y uno o más consumidores podrían usar OAuth fácilmente para proporcionar un token de autenticación verificable, y hay propuestas e ideas para hacerlo, pero un proveedor de servicios arbitrario que solo hable de OAuth Core no puede proporcionarlo sin otro proveedor de servicios. ordenación con un consumidor. El método REST AuthSubTokenInfo específico de Google, junto con el identificador del usuario, está cerca, pero tampoco es adecuado, ya que podría invalidar el token o el token podría haber caducado.
Si su ID de Google es un identificador de OpenId, y su ''interfaz pública'' es una aplicación web o puede llamar al navegador del usuario, entonces probablemente debería usar el OP de OpenID de Google.
OpenID consiste simplemente en enviar al usuario al OP y recuperar una afirmación firmada. La interacción es únicamente para el beneficio del RP. No hay un token de larga duración u otro identificador específico del usuario que pueda utilizarse para indicar que un RP ha autenticado correctamente a un usuario con un OP.
Una forma de verificar una autenticación previa contra un identificador de OpenID es simplemente realizar la autenticación nuevamente, suponiendo que se esté utilizando el mismo agente de usuario. El OP debería poder devolver una afirmación positiva sin interacción del usuario (verificando un certificado de cookie o cliente, por ejemplo). El OP es libre de requerir otra interacción del usuario, y probablemente lo hará si la solicitud de autenticación proviene de otro dominio (mi OP me da la opción de volver a autenticar este RP en particular sin interactuar en el futuro). Y en el caso de Google, la IU que el usuario pasó para obtener el token OAuth podría no usar el mismo identificador de sesión, por lo que el usuario tendrá que volver a autenticarse. Pero en cualquier caso, podrás afirmar la identidad.
Ok, la mayoría de las respuestas son válidas pero no del todo correctas. La idea de JWT es que pueda validar el token sin necesidad de contactar al emisor cada vez. Debe verificar la identificación y verificar la firma del token con la clave pública conocida del certificado que utilizó Google para firmar el token.
Vea la próxima publicación por qué y cómo hacer esto.
http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/
Para la verificación del usuario, solo publique el token de acceso como accessToken y publíquelo y obtenga la respuesta
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken
También puedes probar en la barra de direcciones de los navegadores, usar httppost y response en java también
la respuesta será como
{
"issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
"scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
"expires_in": 3340,
"access_type": "offline"
}
El alcance es el permiso otorgado por accessToken. puedes verificar los identificadores de alcance en este enlace
puede verificar un token de acceso de autenticación de Google utilizando este punto final:
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>
Este es el endpoint de validación de Google V3 OAuth AccessToken, puede consultar desde el documento de google a continuación: (En la OAUTH 2.0 ENDPOINTS
)
https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token
La respuesta de flujo de código de Google oauth además de access_token
también devuelve id_token
que contiene información de validación útil en forma cifrada.
Una cosa que hace que los tokens de ID sean útiles es que puedes pasarlos por diferentes componentes de tu aplicación. Estos componentes pueden usar un token de identificación como un mecanismo de autenticación liviano que autentica la aplicación y el usuario. Pero antes de que pueda usar la información en el token de ID o confiar en él como una afirmación de que el usuario se ha autenticado, debe validarlo.
La validación de un token de ID requiere varios pasos:
- Verifique que el token de identificación sea un JWT que esté debidamente firmado con una clave pública de Google apropiada.
- Verifique que el valor de aud en el token de ID sea igual al ID de cliente de su aplicación.
- Verifique que el valor de iss en el token de identificación sea igual a accounts.google.com o https://accounts.google.com .
- Verifique que el tiempo de expiración (exp) del token ID no haya pasado.
- Si pasaste un parámetro hd en la solicitud, verifica que el token de ID tenga un reclamo hd que coincida con tu dominio alojado en Google Apps.
https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken link tiene ejemplos de código para la validación de tokens de ID.
Ver también https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth .
function authenticate_google_OAuthtoken($user_id)
{
$access_token = google_get_user_token($user_id); // get existing token from DB
$redirecturl = $Google_Permissions->redirecturl;
$client_id = $Google_Permissions->client_id;
$client_secret = $Google_Permissions->client_secret;
$redirect_uri = $Google_Permissions->redirect_uri;
$max_results = $Google_Permissions->max_results;
$url = ''https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=''.$access_token;
$response_contacts = curl_get_responce_contents($url);
$response = (json_decode($response_contacts));
if(isset($response->issued_to))
{
return true;
}
else if(isset($response->error))
{
return false;
}
}