如何使用带有OAuth v2 UserCredentials的Google Contact API v3创建联系人服务

本文关键字:API Contact v3 创建 服务 联系人 Google 何使用 OAuth UserCredentials v2 | 更新日期: 2023-09-27 18:31:17

我的应用程序正在使用带有OAuth的Google API日历V3,这很好用。它将在第一次征求用户的同意。使用日历服务创建、修改和删除日历事件很容易。目前为止,一切都好!

现在我想请求用户添加和修改联系人数据的权限。通过添加以下字符串"https://www.google.com/m8/feeds/",还会要求用户进行联系人访问审批。这似乎有效。但是,我找不到基于通过上述过程收到的用户凭据创建联系人服务的方法。如何将用户凭据与联系人服务一起使用?

我阅读了所有带有标签的问题:Google-contact和Google-api-dotnet-client。我确实检查了API V3上的文档,我发现为日历,云端硬盘和许多其他API创建了服务,但没有为联系人创建服务?我错过了什么?

这是我用来请求权限和启动日历服务的代码片段。

using Google.Contacts;
using Google.GData.Contacts;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using System.Threading;
using Google.Apis.Services;
namespace MY
{
class GoogleContact
{
    static public void start_service()
    {
        UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            new ClientSecrets
            {
                ClientId = "clientID",
                ClientSecret = "clientsecret",
            },
            new[] { CalendarService.Scope.Calendar, "https://www.google.com/m8/feeds/" }, // This will ask the client for concent on calendar and contatcs
            "user",
            CancellationToken.None).Result;

        // Create the calendar service.
        CalendarService cal_service = new CalendarService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Calendar API Sample",
        });
        // How do I use the found credential to create a ContactsService????
        ContactsService service = new ContactsService("APP_NAME");

    }

感谢对我必须采取的后续步骤的任何反馈?

获得反馈后更新:

我添加了以下代码片段以使用联系人数据。

        // Get the tokens from the FileDataStore
        var token = new FileDataStore("Google.Apis.Auth")
            .GetAsync<TokenResponse>("user"); 
        OAuth2Parameters parameters = new OAuth2Parameters
        {
            ClientId = mSecrets.ClientId,
            ClientSecret = mSecrets.ClientSecret,
            // Note: AccessToken is valid only for 60 minutes
            AccessToken = token.Result.AccessToken, 
            RefreshToken = token.Result.RefreshToken
        };
        RequestSettings settings = new RequestSettings(
            "Contact API Sample", parameters);
        ContactsRequest cr = new ContactsRequest(settings);
        Feed<Contact> f = cr.GetContacts();
        // The AccessCode is automatically updated after expiration!
        foreach (Contact c in f.Entries)
        {
            Console.WriteLine(c.Name.FullName);
        }

首先,我从文件数据存储中读回访问令牌和刷新令牌。
然后我使用刚刚读取的令牌设置 OAuth2Parameters。
现在,我可以构造一个新的联系人服务和联系人请求。

令我惊讶的是,访问令牌在过期后也会自动续订联系人服务。

如何使用带有OAuth v2 UserCredentials的Google Contact API v3创建联系人服务

你就是不能。
您正在尝试使两个不同的库(GData 和 Google API)协同工作。

GData 文档在以下版本中可用: https://code.google.com/p/google-gdata/联系人 API 的 NuGet 包在以下版本中可用: https://www.nuget.org/packages/Google.GData.Contacts/.

适用于 .NET 的 Google API 客户端库是较新的库。但是,不幸的是,联系人API不支持它。所有受支持的 Google API 的列表在以下位置提供: https://developers.google.com/api-client-library/dotnet/apis/,您也可以在那里找到入门页面。

更新:我不熟悉GData API,但是...

1)您可以将日历以外的更多范围添加到AuhorizeAsync方法中,以包括联系人范围(如果有)

2) 可以使用返回的访问令牌 + 来自数据存储的刷新令牌(默认情况下,您使用的是 FileDataStore,并启动 GData 请求(我再次不熟悉 API)以使用访问令牌。

它可能对你有用,但你必须调查更多。我没有尝试过,因为我不熟悉GData。

更新 2:向文件数据存储添加正确的调用:

var token = new FileDataStore("Google.Apis.Auth")
    .GetAsync<TokenResponse>("user");
var accessToken = token.AccessToken; // valid for 60 minutes ONLY.
var refreshToken = token.RefreshToken;

应检索包含访问令牌和刷新令牌的令牌响应。

** 如果用户未提供默认数据存储(您的情况),GoogleWebAuthorizationBroker 负责使用上述文件夹创建默认数据存储。

** 身份验证库负责存储正确的数据。有关更多详细信息,请查看授权代码流。