How to make CalendarService object using access_token?
google-api-dotnet-client, google-calendar-api, oauth-2.0
Solution
The question was asked about a year ago but anyway here is the code I use to initialize CalendarService having accessToken only.
At first, I implemented a "clone" of UserCredential class based on its source code but removing all unnecessary staff related to Google APIs OAuth2 methods
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);
}
}
After that, creating an instance of CalendarService looks pretty simple:
private CalendarService GetCalendarService(string accessToken)
{
return new CalendarService(new BaseClientService.Initializer
{
HttpClientInitializer = new CustomUserCredential(accessToken),
ApplicationName = "AppName"
});
}
Problem
I am trying to use google calendar v3 api using .net client. I am follwing a hybrid approach. I have authorized my application using oauth2 using only http post request and I get the access_token. But as .net client of calendar v3 api, I need to make a calendarservice reference. I need to find any way to get that service reference using my token. Have a look at this code snippet: ``` Event event = new Event() { Summary = "Appointment", }; Event recurringEvent = service.Events.Insert(event, "primary").Fetch(); // here "service" is authenticate calendarservice instance. Console.WriteLine(recurringEvent.Id); ``` and this is the code to get authenticated calendarservice instance: ``` 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", }); ``` This code shows the authorization code flow according to Google.Apis.Auth.OAuth2 and then make service reference using that credential. Actually this is a helper utility to manage authorization code flow. To be clear, I am not using this procedure.(this helper utility). I am trying to do everything in core level that means I have made authorization code flow manually by simple HTTP web request. And I have done authorization perfectly. Now I have that users access_token. Now my question is that how can I create this service instance manually only using that access_token. If anything bother you, feel free to ask anything. N.B - I know how to create CalendarService instance: ``` var service = new CalendarService(); ``` but how can I create this type instance with connected to authenticated token which I have.