2008-12-11 23 views
73

¿Cómo puedo verificar un token de acceso de autenticación de Google?¿Cómo puedo verificar un token de acceso a la API 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]]?

corta Versión:
Es claro cómo un token de acceso suministrado a través de la Google Authentication Api :: OAuth Authentication for Web Applications se puede utilizar para a continuación solicitar datos de una amplia 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 utiliza la autenticación basada en token. Se devolverá un token con la provisión de un nombre de usuario y contraseña válido o con la provisión de un token de terceros a partir de cualquiera de los servicios verificables N.

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:

alt text 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 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 utiliza 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 indica 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.

Actualización 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 de verificar que un supuesto usuario de Google es quien dicen ser. Si hay otra forma de hacerlo, estoy feliz de intentarlo.

+0

Lo específico del servicio de autenticación es esta pregunta acerca de (OAut h, AuthSub, aplicaciones instaladas, ...)? Proporcione un enlace más detallado. –

+0

@Martin v. Löwis: El servicio de 'Autenticación OAuth para aplicaciones web' - He actualizado el comienzo de la pregunta para reflejar esto. ¡Gracias por señalar esto! –

+0

artículo interesante sobre la verificación de claves de Google podría proporcionar más información http://groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7 – dotjoe

Respuesta

-1

Intente hacer una solicitud válida y comprobar si hay una respuesta de token no válida.

-1

Google nunca podría responder a su pregunta, porque no es "¿es válido este token de acceso?" Es token + secreto.

1

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 Federated Login for Google Account Users desde su dominio 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 utiliza en la página de inicio de sesión federado de Google 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.

Así que debe 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.

0

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.

0

No se puede usar un token de acceso OAuth arbitrario para la autenticación, porque 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 OAuth y uno o más consumidores pueden 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 OAuth Core no puede proporcionar este sin otra coordinació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 utilizar el OP de OpenID de Google.

OpenID consiste en simplemente 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 frente a un identificador de OpenID es simplemente realizar de nuevo la autenticación, 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.

+0

OpenID 2.0 recientemente fue desaprobado y deshabilitado por Google a favor de OpenID Connect basado en OAuth que proporciona [tokens de identificación verificables] (http://stackoverflow.com/a/31597027/603516). – Vadzim

14
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; 
    } 
} 
+0

Sí, es la respuesta esperada. –

+2

Esta respuesta es casi válida. Issued_to parece que ya no se establece más. https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken – frostymarvelous

80

Para la comprobación de usuario, se limite a publicar obtener el token de acceso como accessToken y que lo ponga y obtener la respuesta

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken 

se puede tratar en la barra de direcciones en los navegadores también utilizan HttpPost y la respuesta en Java también

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 dado del accessToken. puede comprobar los identificadores de alcance en this link

+4

Hay una versión más reciente de oauth2 - v3 de google. Vea el ejemplo aquí: https://developers.google.com/identity/sign-in/android/backend-auth –

0

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(); 
} 
2

Google oauth code flow response además de access_token también devuelve id_token que contiene información útil para la validación de forma encriptada.

Una cosa que hace que los tokens ID sean útiles es que puedes pasar alrededor de los 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 poder utilizar la información en el token ID o confiar en ella como una afirmación de que el usuario se ha autenticado, debe validarla.

Validación de un token de ID requiere varios pasos:

  • Compruebe que el identificador ID es un JWT que está correctamente firmado con una clave pública apropiada Google.
  • 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 ID sea igual a accounts.google.com o https://accounts.google.com.
  • Verifique que el tiempo de expiración (exp) del token de identificación no haya pasado.
  • Si pasó un parámetro hd en la solicitud, verifique que el token de ID tenga un reclamo hd que coincida con su dominio alojado en Google Apps.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken enlace tiene ejemplos de código para la validación de tokens de ID.

Véase también https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth.

3

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.

Consulte la siguiente publicación sobre por qué y cómo hacerlo.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/

9

puede verificar un token de acceso de autenticación de Google mediante el uso de este criterio de valoración:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token> 

Esto es Google V3 OAuth accessToken punto final validación, se puede hacer referencia a partir del documento de Google a continuación: (En OAUTH 2.0 ENDPOINTS Tab)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

Cuestiones relacionadas