如何使用access_token创建CalendarService对象?

时间:2014-02-03 13:33:54

标签: oauth-2.0 google-calendar-api google-api-dotnet-client

我正在尝试使用.net客户端使用google calendar v3 api。我正在采用混合方法。我只使用http post请求使用oauth2授权我的应用程序,我得到了access_token。但作为日历v3 api的.net客户端,我需要制作一个日历服务参考。我需要找到任何方法来使用我的令牌获取该服务引用。看看这段代码:

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 Web请求手动创建了授权代码流。我完全完成了授权。现在我有那个用户access_token。

现在我的问题是如何仅使用该access_token手动创建此服务实例。如果有什么事情困扰你,请随时提出任何问题。

N.B - 我知道如何创建CalendarService实例:

 var service = new CalendarService();

但是如何创建此类型实例并连接到我拥有的经过身份验证的令牌。

4 个答案:

答案 0 :(得分:10)

这个问题大约在一年前被问到,但无论如何这里是我用来初始化只有accessToken的CalendarService的代码。

首先,我根据其源代码实现了UserCredential类的“克隆”,但删除了与Google API 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"
            });
    }

答案 1 :(得分:0)

您使用FileDataStore的示例。

FileDataStore如何工作 - 第一次运行代码时,它会询问用户是否允许您访问该日历。然后将信息存储在%appData%目录中。如果要加载例如存储在数据库中的刷新令牌,则无法加载。

存储的Refreshtoken - 为了使用例如存储在数据库中的refreshToken,您需要创建自己的IdataStore限制。完成后,您将能够发送之前保存的刷新令牌。

本教程可帮助您了解http://www.daimto.com/google-oauth2-csharp/

您无需处理获取新访问令牌,服务将使用RefreshTokens为您获取新的访问令牌。

如果这没有帮助发表评论,我会看看我是否可以多花一点时间。

答案 2 :(得分:0)

我最喜欢@ alexey的回复,但作为替代方案,您可以使用简单的构造函数进行初始化,然后在每个请求中传递访问令牌,如下所示:

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

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

答案 3 :(得分:-1)

您的解决方案应该与此类似: .NET Google api 1.7 beta authenticating with refresh token

请记住设置ExpiresInSeconds和Issued属性,这样库就不会认为access_token已过期(https://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis.Auth/OAuth2/Responses/TokenResponse.cs#66