Hannan Hossain
Hannan Hossain

Reputation: 740

How to make CalendarService object using access_token?

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.

Upvotes: 6

Views: 3145

Answers (4)

fredw
fredw

Reputation: 1419

I like @alexey's response the best but as an alternative you can initialize with the simple constructor and then pass the access token in on each request, like this:

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

// Request
var request = service.Events.Get("x", "y");
request.OauthToken = accessToken;
var response = request.Execute();

Upvotes: 0

Alexey Gurevski
Alexey Gurevski

Reputation: 521

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

Upvotes: 13

Linda Lawton - DaImTo
Linda Lawton - DaImTo

Reputation: 116968

The example you uses FileDataStore.

How FileDataStore works - The first time you run the code it will ask the user if they want to let you access there calender. The information is then stored in your %appData% directory. If you want to load a refresh token that you have for example stored in the database you cant.

Stored Refreshtoken - In order to use a refreshToken that you for example have stored in the database you need to create your own implimitation of IdataStore. Once you have done that you will be able to send the refresh token that you saved previously.

This tutorial should help you understand http://www.daimto.com/google-oauth2-csharp/

You dont need to deal with getting new access token the Service will use the RefreshTokens to get a new access token for you.

If this doesnt help post a comment and i will see if i can expend it a little more.

Upvotes: 0

peleyal
peleyal

Reputation: 3512

Your solution should look very similar to this one: .NET Google api 1.7 beta authenticating with refresh token

Remember to set the ExpiresInSeconds and Issued properties, so the library won't think that the access_token has expired (https://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis.Auth/OAuth2/Responses/TokenResponse.cs#66)

Upvotes: -1

Related Questions