1

我正在尝试使用 C# .NET GData SDK 从 Profile API 检索 Google Profile 以进行编辑,但身份验证似乎失败了。我正在使用许多其他 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 ---> System.Net.WebException:远程服务器返回错误:(401)未经授权。

根据 Google Enterprise 支持人员的建议,我使用了他们的 OAuth2 Playground 站点,使用的凭据与代码中的凭据相同,并且成功了。

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

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

有没有人有任何关于如何使用 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:值不能为空。参数名称:refresh_token

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

有什么有用的指示吗?

4

2 回答 2

0

我正在将它从 google-apps-script(基于云的 JavaScript)重新标记为 google-apps。

关于您的问题 - 是的,您需要使用 oAuth 2,但 oAuth 2 本身为您提供了一些选项。一旦你花几个小时来理解它——它就会真正得到回报,因为它在许多供应商中变得非常标准和司空见惯。

Google 提供了几个入门库(包括 .NET)让您从这里开始 - https://developers.google.com/accounts/docs/OAuth2#libraries

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

于 2012-12-05T12:17:32.463 回答
0

经过大量试验,我从我需要的 Profile API 中得到了结果,而没有使用 OAuth2,这太让人头疼了(主要是因为 Google SDK 及其文档的质量很差,这个概念很简单) .

我使用了简单的用户名和密码身份验证方法,而不是使用 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);
于 2012-12-05T16:00:18.057 回答