2014-02-03 3 views
4

Я пытаюсь использовать Google Calendar v3 api, используя .net-клиент. Я рассматриваю гибридный подход. Я разрешил свое приложение, используя oauth2, используя только http post request, и я получаю access_token. Но как .net-клиент календаря v3 api, мне нужно сделать ссылку для календаря. Мне нужно найти способ получить эту служебную ссылку, используя мой токен. Посмотрите на этот фрагмент кода:Как создать объект CalendarService с помощью access_token?

Event event = new Event() 
{ 
    Summary = "Appointment",  
}; 

Event recurringEvent = service.Events.Insert(event, "primary").Fetch(); 
// here "service" is authenticate calendarservice instance. 

Console.WriteLine(recurringEvent.Id); 

и это код, чтобы пройти аутентификацию calendarservice Например:

UserCredential credential; 
using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
{ 
     credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       new[] { CalendarService.Scope.Calendar }, 
       "user", CancellationToken.None, new FileDataStore("something")); 
} 

    // Create the service instance. 
    var service = new CalendarService(new BaseClientService.Initializer() 
    { 
      HttpClientInitializer = credential, 
      ApplicationName = "Books API Sample", 
    }); 

Этот код показывает поток кода авторизации согласно Google.Apis.Auth.OAuth2 и затем выполните служебную ссылку, используя эти учетные данные. На самом деле это вспомогательная утилита для управления потоком кода авторизации. Чтобы быть ясным, я не использую эту процедуру (эта вспомогательная утилита). Я пытаюсь сделать все на основном уровне, что означает, что я сделал поток кода авторизации вручную простым HTTP-запросом. И я сделал авторизацию отлично. Теперь у меня есть пользователи access_token.

Теперь мой вопрос заключается в том, как создать этот экземпляр службы вручную только с помощью этого access_token. Если что-нибудь беспокоит вас, не стесняйтесь спрашивать что-либо.

N.B - Я знаю, как создать экземпляр CalendarService:

var service = new CalendarService(); 

, но как я могу создать этот тип экземпляра с присоединенным к опознавательный признак, который у меня есть.

+0

Вы только пытаетесь получить доступ к своему календарю? или вы разрешаете пользователям получать доступ к каландрам через ваше приложение? – DaImTo

+0

@DaImTo Мне нужно будет получить доступ к их календарю, чтобы я мог отправлять события в свой календарь. Пользователь будет аутентифицировать это разрешение. Я сделал эту часть и с разрешением (календарный объем/объем), у меня есть этот токен доступа. –

ответ

-1

Ваше решение должно выглядеть очень похоже на это один: .NET Google api 1.7 beta authenticating with refresh token

Не забудьте установить ExpiresInSeconds и Выданные свойствами, поэтому библиотека не будет думать, что access_token истекло (https://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis.Auth/OAuth2/Responses/TokenResponse.cs#66)

+0

Я пробовал код из этой ссылки, но почему-то это не работает. –

0

Пример вы используете FileDataStore.

Как работает FileDataStore - при первом запуске кода он запрашивает у пользователя, хотят ли они предоставить вам доступ к календарю. Затем информация сохраняется в вашем каталоге% appData%. Если вы хотите загрузить токен обновления, который вы, например, сохранили в базе данных, вы не можете.

Хранилище Refreshtoken - Чтобы использовать refreshToken, который вы, например, сохранили в базе данных, вам необходимо создать собственное импликацию IdataStore. Как только вы это сделаете, вы сможете отправить токен обновления, который вы сохранили ранее.

Этот учебник поможет вам понять http://www.daimto.com/google-oauth2-csharp/

Вам не нужно иметь дело с получением нового маркера доступа Служба будет использовать RefreshTokens, чтобы получить новый маркер доступа для вас.

Если это не поможет оставить комментарий, и я увижу, могу ли я потратить его немного больше.

+0

@DalmTo Я не использовал FileDataStore. Я дал этому коду знать, как это сделать вручную. Я получил access_token вручную, используя http-запрос для api. Теперь мне нужно сделать эту ссылку службы, используя этот access_token. Вы поняли? –

+0

ваш код имеет новый FileDataStore («что-то»)); И вы заявляете, что используете ваш календарь v3 api. Для создания всех вызовов oauth2 требуется немного больше работы. проверьте эту ссылку, дайте мне знать, если вам нужна помощь: http://www.daimto.com/google-api-and-oath2/ – DaImTo

+0

@DalmTo См. мое редактирование в вопросе. Я добавил дополнительную информацию, чтобы устранить проблему. Думаю, ты это получишь. Я не использую этот вспомогательный класс, предоставляемый календарем Google. Я делаю это вручную. И я успешно завершил процесс авторизации. Просто нужно сделать ссылку на службу, используя этот access_token, чтобы использовать .net-клиент. –

7

Вопрос был задан примерно год назад, но в любом случае вот код, который я использую для инициализации CalendarService, имеющего доступ только для Token.

Сначала я реализовал «клон» UserCredential класса на основе исходного кода, но удаление всех ненужных сотрудников, связанных с методами Google APIs oauth2

internal class CustomUserCredential : IHttpExecuteInterceptor, IConfigurableHttpClientInitializer 
{ 
    private string _accessToken; 

    public CustomUserCredential(string accessToken) 
    { 
     _accessToken = accessToken; 
    } 

    public void Initialize(ConfigurableHttpClient httpClient) 
    { 
     httpClient.MessageHandler.ExecuteInterceptors.Add(this); 
    } 

    public async Task InterceptAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken); 
    } 
} 

После этого создания экземпляра CalendarService выглядит довольно просто :

private CalendarService GetCalendarService(string accessToken) 
    { 
     return new CalendarService(new BaseClientService.Initializer 
      { 
       HttpClientInitializer = new CustomUserCredential(accessToken), 
       ApplicationName = "AppName" 
      }); 
    } 
+0

Это было чрезвычайно полезно. Есть ли веская причина для простого класса, подобного этому, не являющегося частью .NET API? Эта проблема в основном занимала у меня много времени, чтобы понять, потому что я был уверен, что просто не нашел подходящих классов в API. Удивительно было узнать, что они не существуют для выполнения базовой аутентификации oauth2 в API. – cl0rkster

+0

Это действительно полезно. Спасибо @AlexeyGureski. –

+0

Алексей, вы можете добавить этот ответ на мой вопрос здесь: http://stackoverflow.com/questions/41039044/using-the-google-api-net-client-with-an-existing-access-token, и я буду отмечать это как ответ! Спасибо за вашу помощь. – ThomasWeiss

0

Мне нравится ответ @ АЛЕКСЕЙ самый лучший, но в качестве альтернативы можно инициализировать с простым конструктором, а затем передать маркер доступа в каждом запросе, например:

// Create service 
var service = new CalendarService(); 

// Request 
var request = service.Events.Get("x", "y"); 
request.OauthToken = accessToken; 
var response = request.Execute(); 
Смежные вопросы