library google for example apis java google-oauth google-login

java - for - Autenticación programática a Google con OAuth2



oauth 2.0 google java (5)

¿Cómo puedo autenticarme programáticamente en Google? Ahora que ClientLogin ( https://developers.google.com/accounts/docs/AuthForInstalledApps ) está en desuso, ¿cómo podemos realizar una autenticación programática a Google con OAuth2?

Con ClientLogin podríamos realizar una publicación en https://www.google.com/accounts/ClientLogin con los parámetros de correo electrónico y contraseña y obtener el token de autenticación.

Con OAuth2 no puedo encontrar una solución!

#

Mi aplicación es un proceso de fondo de Java. Vi, siguiendo este enlace: developers.google.com/accounts/docs/OAuth2InstalledApp#refresh, cómo obtener un nuevo token de acceso usando un token actualizado.

El problema es que no puedo encontrar un ejemplo de java sobre cómo crear una instancia de un objeto de Analytics (por ejemplo) para realizar una consulta cuando tengo un nuevo token de acceso válido

Este es mi código que devuelve 401 credenciales no válidas cuando invoco el "execute ()":

public class Test { static final String client_id = "MY_CLIENT_ID"; static final String client_secret = "MY_SECRET"; static final String appName = "MY_APP"; private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); private static final JsonFactory JSON_FACTORY = new JacksonFactory(); static String access_token = "xxxx"; static String refreshToken = "yyyyy"; public static void main (String args[]){ try { GoogleCredential credential = new GoogleCredential.Builder() .setTransport(HTTP_TRANSPORT) .setJsonFactory(JSON_FACTORY) .setClientSecrets(client_id, client_secret).build(); credential.setAccessToken(access_token); credential.setRefreshToken(refreshToken); //GoogleCredential Analytics analytics = Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY) .setApplicationName(appName) .setHttpRequestInitializer(credential) .build(); Accounts accounts = analytics.management().accounts().list().execute(); } catch (Exception e) { e.printStackTrace(); } }

¿Cuál es el problema?


Aunque aprecio que el OP originalmente se OAuth2InstalledApp enfoque OAuth2InstalledApp , me gustaría señalar una solución de trabajo utilizando el enfoque OAuth2WebServer . No difieren significativamente y esto funcionó para mí. He encontrado que la biblioteca de Google OAuth es bastante buena ya que manejará la mayor parte de la danza de OAuth para usted y hace que sea más fácil actualizar el token de acceso. La solución a continuación depende del uso de un token de actualización previamente obtenido.

Como dice la respuesta aceptada, para que la autenticación OAuth funcione (incluso para un proceso en segundo plano Java) donde la solicitud se basa en el acceso a los datos del usuario

requiere que el usuario se autentique con un navegador la primera vez, pero luego puede almacenar el token de actualización y usarlo para solicitudes posteriores.

De los comentarios anteriores del OP veo los siguientes

Así que seguí OAuth2 para aplicaciones de servidor web (aquí se documenta el acceso sin conexión) pero todavía tengo problemas.
1) Realizo la primera solicitud a través del navegador y obtengo el código de autenticación para el acceso sin conexión
2) Realizo una publicación java del código de autenticación y obtengo el token de acceso y el token de actualización

El enfoque que utilicé es más como

1) Realizo la primera solicitud a través de un navegador y obtengo el token de actualización para el acceso sin conexión
2) En Java, proporciono el token de actualización a la biblioteca y la biblioteca obtendrá el token de acceso, etc.

específicamente, al usar la biblioteca google-api-java-client, el código es bastante sencillo y tenga en cuenta que no he establecido un token de acceso como lo hizo el OP, ya que estoy llamando credential.refreshToken(); en otra parte. (Compruebo si ya tengo un token de acceso válido y, si no lo hago, actualizo la llamada antes de la llamada a la API)

private Credential generateCredentialWithUserApprovedToken() throws IOException, GeneralSecurityException { JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); InputStreamReader inputStreamReader = new InputStreamReader(jsonFileResourceForClient.getInputStream()); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, inputStreamReader); return new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory) .setClientSecrets(clientSecrets).build().setRefreshToken(REFRESH_TOKEN); }

Tenga en cuenta que esto cubre el paso 2 de mi enfoque, y el REFRESH_TOKEN mencionado en el paso 1 se puede obtener como se explica a continuación.

Primero, hay una configuración previa de una OAuth2WebServer crea un ID de cliente OAuth 2.0 en la consola de Google para Credenciales, donde termina con un archivo json descargado que se leerá en el objeto GoogleClientSecrets .

es decir

Asegúrese de agregar el uri de devolución de llamada del área de juegos de Google en los URI de redireccionamiento autorizados

Luego tiene su identificación de cliente y el secreto del cliente listos para el patio de recreo y también puede descargar el json que puede ingresar en su código Java.

El REFRESH_TOKEN se obtiene enviando una solicitud al área de juegos de Google oauth con la siguiente configuración. Tenga en cuenta que antes del Paso 1 y al seleccionar su alcance, debe ir a la configuración para verificar que le está proporcionando sus propias credenciales y agregar su identificación de cliente y su secreto justo debajo de eso.

Tenga en cuenta que el tipo de acceso es Desconectado, que corresponde a this .

También hay una buena explicación sobre cómo capturar el token de actualización aquí https://www.youtube.com/watch?v=hfWe1gPCnzc

¡Eso es suficiente para ponerse en marcha y es una configuración única!

Con respecto a los tokens de actualización, debe conocer su ciclo de vida como se explica en los documentos here

En el oauthplayground verás esto.

Pero en el punto 4 de los documentos here dice esto

Hmmm

También como referencia, consulte ¿Cómo autorizo ​​una aplicación (web o instalada) sin la intervención del usuario? (canónico?)


Encontré que el cliente de Google Java es demasiado complejo y está mal documentado. Aquí está el example simple y simple de Servlet con Google Oauth2. Para un proceso en segundo plano, deberá solicitar access_type = offline. Como han mencionado otros, necesita que el usuario realice una autorización única. Después de eso, puede solicitar tokens de actualización, ya que los tokens de google caducan en una hora.


He documentado un ejemplo utilizando Javascript y obteniendo un token de autorización aquí

http://www.alexroque.com/?p=307

Esperemos que sea útil. Lo que desea hacer es asegurarse de que nuestro URI de retorno esté configurado correctamente en su consola API y de que analice el token correctamente de la respuesta.


Para las aplicaciones que se autentican en nombre de ellos mismos (es decir, para otra aplicación, tradicionalmente al iniciar sesión en una cuenta de rol con una contraseña compartida), la alternativa de OAuth2 a ClientLogin que ofrece Google son las Cuentas de servicio:

https://developers.google.com/accounts/docs/OAuth2ServiceAccount


Verifique el flujo de OAuth 2 para la aplicación instalada:

https://developers.google.com/accounts/docs/OAuth2InstalledApp

Todavía requiere que el usuario se autentique con un navegador la primera vez, pero luego puede almacenar el token de actualización y usarlo para solicitudes posteriores.

Para soluciones alternativas, verifique el flujo de dispositivos o las cuentas de servicio, se explican en el mismo conjunto de documentación.