【问题标题】:How to create a ContactsService using Google Contact API v3 with OAuth v2 UserCredentials如何使用带有 OAuth v2 UserCredentials 的 Google Contact API v3 创建 ContactsService
【发布时间】:2015-01-17 13:27:16
【问题描述】:

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

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

我阅读了所有带有标签的问题: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);
        }

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

令我惊讶的是,在 ContactsService 到期后,访问令牌也会自动更新。

【问题讨论】:

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


    【解决方案1】:

    你就是做不到。
    您正在尝试使两个不同的库(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/,您也可以在那里找到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了解更多详情。

    【讨论】:

    • 感谢您的明确答复!这是否意味着我必须两次询问用户许可?首先是日历数据,使用上面的代码片段,然后以另一种方式(?)用于联系人数据?我认为这会带来一种奇怪的用户体验。是否可以将 UserCredential 中的信息转换为我必须用于联系人数据的 OAuth2Parameters?
    • 更新了我的答案。我也会将 gdata 标签添加到问题中:)
    • 我已经将 Contacts 的范围添加到了 AuthorizeAsync 方法中,至少看起来有效。现在我将尝试找出是否可以将 FileDataStore 信息用于 Gdata API。感谢您的回答,我会接受原始问题的答案。
    • 我更新了 (2) 我的答案 - 我添加了正确的调用,以便获取访问令牌和刷新令牌。
    • Peleyal,感谢您的反馈。我将最终的代码片段添加到原始帖子中。希望其他人也能从中受益。
    猜你喜欢
    • 2012-04-20
    • 2012-05-20
    • 2013-04-24
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2012-05-29
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多