How to make CalendarService object using access_token?

后端 未结 4 1100
我寻月下人不归
我寻月下人不归 2020-12-18 06:06

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

相关标签:
4条回答
  • 2020-12-18 06:21

    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)

    0 讨论(0)
  • 2020-12-18 06:31

    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();
    
    0 讨论(0)
  • 2020-12-18 06:32

    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.

    0 讨论(0)
  • 2020-12-18 06:37

    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"
                });
        }
    
    0 讨论(0)
提交回复
热议问题