我正在尝试使用 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 对象无法使用的证书。
有什么有用的指示吗?