无法检索Google个人资料进行编辑

时间:2012-12-05 10:35:09

标签: c# google-apps

我正在尝试使用C#.NET GData SDK从Profile API检索Google个人资料以进行编辑,但身份验证似乎失败了。我正在使用其他一些Google API,并且可以使用相同的代码方法对它们进行身份验证:

var settings = new RequestSettings("appname", ApiUsername, ApiPassword);
var contactsRequest = new ContactsRequest(settings);
var uri = new Uri(string.Format("https://www.google.com/m8/feeds/profiles/domain/{0}/full/{1}", googleDomain, googleUsername));
var contact = contactsRequest.Retrieve<Contact>(uri);

我得到以下异常:

  

Google.GData.Client.GDataRequestException:执行请求   失败:   https://www.google.com/m8/feeds/profiles/domain/xxx/full/joe.bloggs   ---&GT; System.Net.WebException:远程服务器返回错误:(401)Unauthorized。

根据Google Enterprise支持的建议,我使用与代码相同的凭据来使用他们的OAuth2 Playground网站,并且它有效。

我的猜测是SDK在接收用户名和密码时不会在RequestSettings对象中使用这些凭据,并且身份验证失败,即使这种方法适用于其Provisioning API。

我担心我需要使用OAuth2,这对于我们正在尝试做的事情似乎并不复杂,并且没有Google文档可以支持这一点。

有没有人有关于如何使用Profiles API进行身份验证的代码示例?

修改

所以,是的,似乎我必须使用OAuth2并且Google SDK已损坏,因为它不允许您仅使用用户名和密码进行身份验证。我一直在使用大量示例进行攻击,并使用另一个提供OAuth2支持的Google SDK。

我已经通过API控制台为已安装的应用程序创建了客户端ID,并为该范围分配了此id API访问权限,并使用以下代码:

var oAuth2Parameters = new OAuth2Parameters
{
    ClientId = "xxx",
    ClientSecret = "xxx",
    RedirectUri = "urn:ietf:wg:oauth:2.0:oob",
    Scope = "https://www.google.com/m8/feeds/"
};

// get an access token
OAuthUtil.GetAccessToken(oAuth2Parameters);

var settings = new RequestSettings("xxx", oAuth2Parameters);
var contactsRequest = new ContactsRequest(settings);

这让我更进一步,但现在我得到以下例外:

  

System.ArgumentNullException:值不能为null。参数名称:   refresh_token

此代码作为后端服务的一部分运行。我不知道安装应用程序的客户端ID类型是否对于身份验证交换类型是错误的。我的第一个想法是使用服务帐户客户端ID类型,但这产生了一个OAuth2Parameters对象无法使用的证书。

有用的指针吗?

2 个答案:

答案 0 :(得分:0)

我正在通过google-apps-script(基于云的JavaScript)将其重新归结为google-apps。

关于你的问题 - 是的,你需要使用oAuth 2,但oAuth 2本身会给你一些选择。一旦你花了几个小时来理解它 - 它将真正得到回报,因为它在许多供应商中变得非常标准和普通。

Google提供了几个入门库(包括.NET)来帮助您入门 - https://developers.google.com/accounts/docs/OAuth2#libraries

如果您遇到任何问题,请尝试其中一些并分享。

答案 1 :(得分:0)

经过大量的实验,我得到了我需要的Profile API的结果,而不使用OAuth2,这太令人头疼了(主要是因为Google SDK及其文档质量差,概念是很简单)。

我使用了简单的用户名&amp;密码验证方法,而不是使用ContactsRequest.Retrieve(uri)我使用:

var settings = new RequestSettings("xxx", ApiUsername, ApiPassword);
var cr = new ContactsRequest(settings);
var uri = new Uri(string.Format("https://www.google.com/m8/feeds/profiles/domain/{0}/full/{1}", googleDomain, googleUsername));
var query = new ContactsQuery(uri.AbsoluteUri);
var feed = cr.Get<Contact>(query);