如何使用带有OAuth v2 UserCredentials的Google Contact API v3创建ContactsService

时间:2014-11-19 20:58:24

标签: c# oauth gdata google-contacts google-api-dotnet-client

我的应用程序正在使用带有OAuth的Google API Calendar V3,这非常有用。它将在第一时间询问用户他们的同意。使用日历服务可以轻松创建,修改和删除日历事件。 到现在为止还挺好!

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

我用标签阅读了所有问题:Google-contact和Google-api-dotnet-client。 我检查了API V3上的文档,我发现了Calendar,Drive和一堆其他API的服务创建,但是没有用于Contact? 我错过了什么?

这是我用来请求权限并启动Calendar Service的代码片段。

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

首先,我从FileDataStore读回访问令牌和刷新令牌。
然后我使用刚读过的令牌设置OAuth2Parameters。
现在,我可以构建一个新的ContactsService和一个ContactsRequest。

令我惊讶的是,对于ContactsService,访问令牌在到期后也会自动续订。

1 个答案:

答案 0 :(得分:2)

你不能。
您正在尝试将两个不同的库(GData和Google API)组合在一起。

GData文档位于:https://code.google.com/p/google-gdata/,联系API的NuGet包位于:https://www.nuget.org/packages/Google.GData.Contacts/

适用于.NET的Google API客户端库是较新的库。但遗憾的是,Contacts API不支持它。 有关所有受支持的Google API的列表,请参见:https://developers.google.com/api-client-library/dotnet/apis/,您也可以在此处找到Getting Started页面。

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

1)您可以在AuhorizeAsync方法中添加除日历之外的更多范围以包含联系范围(如果有)

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

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

更新2:向FileDataStore添加正确的调用:

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

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

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

** Auth库负责存储正确的数据。有关详细信息,请查看authorization code flow