secret net googlewebauthorizationbroker google developer authenticator c# .net google-api google-oauth google-api-dotnet-client

c# - net - id oauth google



Google Coordinate OAuth2 con cuenta de servicio (1)

Tengo una aplicación de consola C # con la biblioteca .Net de Google Coordinate y la autenticación abierta de la cuenta de servicio.

private const string SERVICE_ACCOUNT_EMAIL = "[email protected]"; private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<path-to-private-key-file>/YYY-privatekey.p12"; private const string GOOGLE_COORDINATE_TEAM_ID = "ZZZ"; private CoordinateService BuildService() { X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable); var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate){ ServiceAccountId = SERVICE_ACCOUNT_EMAIL, Scope = CoordinateService.Scopes.Coordinate.GetStringValue() }; var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState); return new CoordinateService(new BaseClientService.Initializer(){ Authenticator = auth }); } //some code that retrieves data from coordinate service public void DoSomething() { CoordinateService service = BuildService(); var response = service.Jobs.List(GOOGLE_COORDINATE_TEAM_ID).Fetch(); ... }

Al recuperar la lista de trabajos del Servicio de coordenadas, se produce DotNetOpenAuth.Messaging.ProtocolException (excepción interna "El servidor remoto devolvió un error: (400) Bad Request"). Usando Fiddler logré ver la respuesta del servicio Google OAuth. Objeto de respuesta JSON:

{ "error" : "invalid_grant" }

He leído algunos artículos que sugieren cambiar la hora del servidor local para coincidir con la hora del servidor de Google OAth. Pero después de cambiar el tiempo a uno y otro lado, el problema sigue siendo el mismo. ¿Podría darme algunas ideas de por qué está sucediendo esto? Gracias por todas las respuestas!


Las cuentas de servicio no se pueden usar con la API de Coordinate. [esto se debe a que la API de Coordinate requiere que los usuarios de API autenticados tengan una licencia de Coordinate, pero no es posible adjuntar una licencia de Coordinate a una cuenta de servicio]

Puede usar el flujo del servidor web en su lugar, encuentre la muestra a continuación.

Asegúrese de actualizar el código a continuación, donde hay comentarios que contienen "ACTUALIZAR".

using System; using System.Diagnostics; using System.Collections.Generic; using DotNetOpenAuth.OAuth2; using Google.Apis.Authentication.OAuth2; using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; using Google.Apis.Coordinate.v1; using Google.Apis.Coordinate.v1.Data; namespace Google.Apis.Samples.CoordinateOAuth2 { /// <summary> /// This sample demonstrates the simplest use case for an OAuth2 service. /// The schema provided here can be applied to every request requiring authentication. /// </summary> public class ProgramWebServer { public static void Main (string[] args) { // TO UPDATE, can be found in the Coordinate application URL String TEAM_ID = "jskdQ--xKjFiFqLO-IpIlg"; // Register the authenticator. var provider = new WebServerClient (GoogleAuthenticationServer.Description); // TO UPDATE, can be found in the APIs Console. provider.ClientIdentifier = "335858260352.apps.googleusercontent.com"; // TO UPDATE, can be found in the APIs Console. provider.ClientSecret = "yAMx-sR[truncated]fX9ghtPRI"; var auth = new OAuth2Authenticator<WebServerClient> (provider, GetAuthorization); // Create the service. var service = new CoordinateService(new BaseClientService.Initializer() { Authenticator = auth }); //Create a Job Resource for optional parameters https://developers.google.com/coordinate/v1/jobs#resource Job jobBody = new Job (); jobBody.Kind = "Coordinate#job"; jobBody.State = new JobState (); jobBody.State.Kind = "coordinate#jobState"; jobBody.State.Assignee = "[email protected]"; //Create the Job JobsResource.InsertRequest ins = service.Jobs.Insert (jobBody, TEAM_ID, "My Home", "51", "0", "Created this Job with the .Net Client Library"); Job results = ins.Fetch (); //Display the response Console.WriteLine ("Job ID:"); Console.WriteLine (results.Id.ToString ()); Console.WriteLine ("Press any Key to Continue"); Console.ReadKey (); } private static IAuthorizationState GetAuthorization (WebServerClient client) { IAuthorizationState state = new AuthorizationState (new[] { "https://www.googleapis.com/auth/coordinate" }); // The refresh token has already been retrieved offline // In a real-world application, this has to be stored securely, since this token // gives access to all user data on the Coordinate scope, for the user who accepted the OAuth2 flow // TO UPDATE (see below the sample for instructions) state.RefreshToken = "1/0KuRg-fh9yO[truncated]yNVQcXcVYlfXg"; return state; } } }

Se puede recuperar un token de actualización utilizando el OAuth2 Playground:

  • En la Consola de API, agregue la URL de OAuth Playground, https://developers.google.com/oauthplayground , como un URI de redirección autorizado (lo necesitaremos cuando recuperemos un token de actualización en el OAuth Playground, a continuación)
  • Vaya al área de juegos de OAuth, en una sesión del navegador que tenga autenticado al usuario de la API (este usuario debe tener una licencia de Coordinate). Asegúrese de proporcionar su propio ID de cliente OAuth2 (Configuración> Usar sus propias credenciales de OAuth) . De lo contrario, su token de actualización estará vinculado al ID del cliente OAuth2 interno de OAuth2 playground, y será rechazado cuando desee utilizar el token de actualización con sus propios ID de cliente para obtener un token de acceso.
  • Use el alcance https://www.googleapis.com/auth/coordinate En el Paso 1, presione "Autorizar la API" En el Paso 2, presione "Códigos de autorización de cambio para fichas"
  • Copia el token de actualización en tu código. Mantenlo seguro.
  • Este token de actualización no caduca, por lo que su aplicación permanecerá autenticada.