使用Google通讯录API访问Google Apps域中其他用户的联系人

时间:2013-10-29 17:20:18

标签: c# .net google-api google-oauth google-contacts

我是Google Apps域的管理员,我正在尝试编写一个程序来访问域中用户的联系人(请注意,我试图访问共享联系人,但每个用户的个人联系人,所以共享联系人API将无济于事。)

最初我使用的是三步认证的“推荐”方法(显示网页,用户批准,使用该标记)。这很好用,除非我尝试了除我自己以外的任何用户,否则我会收到403禁用错误。那么我读到在这种情况下我想要两条腿的auth,虽然它已被弃用。

好吧,我已经提出了这个代码,但现在我得到了401 /未经授权的凭证。我不确定问题出在我的代码或其他地方(我注册应用程序的方式或其他方面),但我很难找到有用的文档。

      public static Feed<Contact> MakeRequest(string userId, int numberToRetrieve = 9999)
        {
          var settings = new RequestSettings(Properties.Settings.Default.ApplicationName,
            Properties.Settings.Default.ApiKey, Properties.Settings.Default.ConsumerSecret,
            Properties.Settings.Default.GoogleUserName, Properties.Settings.Default.Domain);
          var cRequest = new ContactsRequest(settings);
          var query = new ContactsQuery(ContactsQuery.CreateContactsUri(userId));
          query.NumberToRetrieve = numberToRetrieve;
          return cRequest.Get(query);
        }

2 个答案:

答案 0 :(得分:1)

使用3条腿OAuth,只有在用户通过OAuth握手进行特定身份验证时才有效。如果您想代表所有用户拨打电话,则需要使用OAuth 2.0的服务帐户。

查看驱动器API代码示例,它将为您提供有关如何启动OAuth 2.0和服务帐户的一些建议。

https://developers.google.com/drive/service-accounts#use_service_accounts_as_application-owned_accounts

如果您使用的是OAuth 1.0,则需要使用特殊参数xoauth_requestor_id。以下是有关它的更多信息:

https://developers.google.com/accounts/docs/OAuth#GoogleAppsOAuth

答案 1 :(得分:0)

好的,我终于明白了。我觉得这个可能不是它应该工作的方式,我不得不挖掘ServiceAccountCredential的源代码,但它的工作原理。我实际上有一点分裂,但为了清楚起见,这是完全的。

我也从Google.Apis.Authentication切换到Google.Apis.Auth。

    public static Feed<Contact> MakeRequest(string userId, int numberToRetrieve = 9999)
    {
        var serviceCredential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(ServiceEmail)
        {
            Scopes = new[] { @"https://www.google.com/m8/feeds/" },
            User = userId,
        }.FromCertificate(Certificate));

        var reqAccessTokenInfo = serviceCredential.GetType()
          .GetMethod("RequestAccessToken", BindingFlags.Instance | BindingFlags.NonPublic);
        var task = (Task<bool>) reqAccessTokenInfo.Invoke(serviceCredential, parameters: new object[] {new CancellationToken()});
        task.Wait();

        var settings = new RequestSettings(Properties.Settings.Default.ApplicationName, serviceCredential.Token.AccessToken);
        var cRequest = new ContactsRequest(settings);
        var query = new ContactsQuery(ContactsQuery.CreateContactsUri(userId)) { NumberToRetrieve = numberToRetrieve };

        return cRequest.Get<Contact>(query);
    }