2013-10-29 104 views
1

我是Google Apps域的管理员,并且正在尝试编写一个程序来访问域中用户的联系人(请注意,我是不是试图获取共享联系人,但每个用户的个人联系人,所以共享联系人API不会帮助)。使用Google Contacts API访问Google Apps域中的其他用户的联系人

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

嗯,我已经想出了这个代码,但现在我得到了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); 
     }

回答

0

OK,我终于想通了。我觉得这个可能是不是它应该工作的方式,我不得不挖掘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); 
    } 
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

+0

实际上,按照本指南进行操作时遇到了问题。特别是,当我转到注册的应用程序并选择我的应用程序(在云控制台中)时,没有显示有关证书或服务帐户的信息。相反,我只看到一个名为“OAuth 2.0客户端ID”的部分。难道我做错了什么? – Casey

+0

我最终设法创建了一个(我认为)与旧的控制台,但我也看不到如何实际应用您的示例。这描述了创建DriveService并将其传递给OAuth2Authenticator 对象。那么好吧,除了ContactService没有这样的构造函数。我如何实际提出任何请求? – Casey

相关问题