C# 使用Google联系人API访问Google应用程序域中其他用户的联系人

C# 使用Google联系人API访问Google应用程序域中其他用户的联系人,c#,.net,google-api,google-oauth,google-contacts-api,C#,.net,Google Api,Google Oauth,Google Contacts Api,我是Google应用程序域的管理员,正在尝试编写一个程序来访问域中用户的联系人(请注意,我不是试图获取共享联系人,而是每个用户的个人联系人,因此共享联系人API不会有帮助) 最初,我使用的是“推荐”的三条腿身份验证方法(显示网页,用户批准,使用该令牌)。这非常有效,除非我尝试了除我之外的任何用户,否则我会得到一个403禁止的错误。然后我读到,在这个例子中,我想要两条腿的auth,尽管它已经被弃用了 嗯,我已经想出了这个代码,但现在我得到了一个401/未经授权的凭证。我不确定问题是否出在我的代码或

我是Google应用程序域的管理员,正在尝试编写一个程序来访问域中用户的联系人(请注意,我不是试图获取共享联系人,而是每个用户的个人联系人,因此共享联系人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);
        }
publicstaticfeedmakerequest(字符串userId,int-numbertorretrieve=9999)
{
var settings=newrequestsettings(Properties.settings.Default.ApplicationName,
Properties.Settings.Default.ApiKey、Properties.Settings.Default.ConsumerCret、,
Properties.Settings.Default.GoogleUserName、Properties.Settings.Default.Domain);
var cRequest=新联系人请求(设置);
var query=newcontactsquery(ContactsQuery.CreateContactsUri(userId));
query.numbertorRetrieve=numbertorRetrieve;
返回cRequest.Get(查询);

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

查看驱动器API代码示例,它将为您提供如何开始使用OAuth 2.0和服务帐户的一些想法

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


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

查看驱动器API代码示例,它将为您提供如何开始使用OAuth 2.0和服务帐户的一些想法

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


好的,我终于明白了。我觉得这可能不是它应该工作的方式,我必须仔细研究ServiceAccountCredential的源代码,但它是工作的。事实上,我把它分了一些,但为了清楚起见,这里是全部

我还从Google.api.Authentication切换到了Google.api.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);
    }
publicstaticfeedmakerequest(字符串userId,int-numbertorretrieve=9999)
{
var serviceCredential=新ServiceAccountCredential(新ServiceAccountCredential.Initializer(ServiceEmail)
{
作用域=新[]{@”https://www.google.com/m8/feeds/" },
User=userId,
}.FromCertificate(证书));
var reqAccessTokenInfo=serviceCredential.GetType()
.GetMethod(“RequestAccessToken”,BindingFlags.Instance | BindingFlags.NonPublic);
var task=(task)reqAccessTokenInfo.Invoke(serviceCredential,参数:新对象[]{new CancellationToken()});
task.Wait();
var settings=newrequestsettings(Properties.settings.Default.ApplicationName、servicecdential.Token.AccessToken);
var cRequest=新联系人请求(设置);
var query=newcontactsquery(ContactsQuery.CreateContactsUri(userId)){numbertorretrieve=numbertorretrieve};
返回cRequest.Get(查询);
}

好的,我终于明白了。我觉得这可能不是它应该工作的方式,我必须仔细研究ServiceAccountCredential的源代码,但它是工作的。事实上,我把它分了一些,但为了清楚起见,这里是全部

我还从Google.api.Authentication切换到了Google.api.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);
    }
publicstaticfeedmakerequest(字符串userId,int-numbertorretrieve=9999)
{
var serviceCredential=新ServiceAccountCredential(新ServiceAccountCredential.Initializer(ServiceEmail)
{
作用域=新[]{@”https://www.google.com/m8/feeds/" },
User=userId,
}.FromCertificate(证书));
var reqAccessTokenInfo=serviceCredential.GetType()
.GetMethod(“RequestAccessToken”,BindingFlags.Instance | BindingFlags.NonPublic);
var task=(task)reqAccessTokenInfo.Invoke(serviceCredential,参数:新对象[]{new CancellationToken()});
task.Wait();
var settings=newrequestsettings(Properties.settings.Default.ApplicationName、servicecdential.Token.AccessToken);
var cRequest=新联系人请求(设置);
var query=newcontactsquery(ContactsQuery.CreateContactsUri(userId)){numbertorretrieve=numbertorretrieve};
返回cRequest.Get(查询);
}

我在实际执行本指南时遇到困难。特别是,当我转到已注册的应用程序并选择我的应用程序(在云控制台中)时,不会显示任何有关证书或服务帐户的信息。相反,我只看到了一个名为“OAuth 2.0客户端ID”的部分。我做错了什么吗?我最终设法用旧控制台创建了一个(我想),但我也不知道如何实际应用您的示例。这描述了创建DriveService并向其传递OAuth2Authenticator对象。好吧,除了ContactService没有那样的构造函数。我实际上如何提出任何请求?我很难真正遵循这个指南。特别是,当我转到已注册的应用程序并选择我的应用程序(在云控制台中)时,无