2013-06-18 2 views
1

У меня есть консольное приложение C# с Google Coordinate .Net library и открытая аутентификация учетной записи службы.Координатор Google OAuth2 с учетной записью службы

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

На получение списка заданий из Coordinate службы есть DotNetOpenAuth.Messaging.ProtocolException произошло (внутреннее исключение «Удаленный сервер возвратил ошибку: (400) Bad Request»). Использование Fiddler Мне удалось увидеть ответ от службы Google OAuth. JSON объект ответа:

{ 
    "error" : "invalid_grant" 
} 

Я прочитал некоторые статьи, которые предлагают изменить местное время сервера, чтобы соответствовать времени присяги сервера Google. Но после изменения времени на одну и ту же сторону проблема остается прежней. Не могли бы вы дать мне некоторые идеи, почему это происходит? Спасибо за все отзывы!

ответ

1

Учетные записи службы не могут использоваться с API-интерфейсом Координатора. [это связано с тем, что API-интерфейс Координатора требует, чтобы аутентифицированные пользователи API имели лицензию Координатора, но невозможно привязать лицензию на координацию к учетной записи службы]

Вместо этого вы можете использовать поток веб-сервера, пожалуйста, найдите образец ниже ,

Обязательно обновите приведенный ниже код, где есть комментарии, содержащие «TO UPDATE».

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; 
     } 

    } 
} 

освежать маркер может быть получен с помощью в oauth2 Playground:

  • В консоли API, добавьте OAuth площадка URL, https://developers.google.com/oauthplayground, как уполномоченный перенаправления URI (мы будем нуждаться в том, что когда мы возвращаем токен обновления наOAuth Playground, ниже)
  • Перейдите на площадку OAuth в сеансе браузера, в котором пользователь вашего API аутентифицирован (этот пользователь должен иметь лицензию на координацию). Обязательно укажите собственный идентификатор клиента OAuth2 (Настройки> Используйте свои собственные учетные данные OAuth). В противном случае токен обновления будет привязан к внутреннему идентификатору клиента OAuth2 и будет отклонен, если вы хотите использовать токен обновления с вашими идентификаторами клиента, чтобы получить токен доступа.
  • Используйте объем https://www.googleapis.com/auth/coordinate На шаге 1, хита «Разрешает API» на шаге 2, нажмите «валютные коды для маркеров»
  • копирование токенного обновления в вашем коде. Держите его в безопасности.
  • Этот токен обновления не истекает, поэтому ваше приложение будет оставаться аутентифицированным.
+0

Большое спасибо за ваш ответ! Я пытался узнать какую-то информацию около полутора недель. Возможно, вы можете добавить свой ответ в Google Coordinate Documentation каким-то образом. Это очень полезно! –

+0

Не могли бы вы указать, как его достичь в новой библиотеке Google.Apis. –

Смежные вопросы