我正试图获得谷歌应用程序域的组织名称。为此,我使用谷歌应用程序管理设置API。我看到它需要三条腿的OAuth。我尝试实现OAuth 2.0,因为OAuth 1已被弃用。我试了很多方法来得到这份工作,但我总是得到一个未经授权的401。
我请求作用域的令牌:https://apps-apis.google.com/a/feeds/domain/
下面是我的代码:// ClientID & ClientSecret values
var requestFactory = GDAPI.GoogleApps.GetAuthRequestFactory();
string organizationName = String.Empty;
Google.GData.Apps.AdminSettings.AdminSettingsService service =
new Google.GData.Apps.AdminSettings.AdminSettingsService(auth.Domain, Excendia.Mobility.Utilities1.BLL.WebConfig.ExcendiaAppName);
service.RequestFactory = requestFactory;
service.SetAuthenticationToken(token);
try
{
var result = service.GetOrganizationName(); // throw exception here...
}
catch (Exception ex)
{
log.Error(ex);
}
我做错了什么?这与OAuth 2兼容吗?
我还想问是否有另一种方法来获得组织名称,因为GData库应该是过时的,并由新的google . api取代…
解决!
谢谢杰。它在OAuth 2.0 playground上工作。我这边的设置有问题
使用Fiddler,我看到授权头被我的应用程序设置。它被设置为OAuth v1而不是v2。所以我发现我使用了错误的RequestFactory类。需要使用GOAuth2RequestFactory而不是GOAuthRequestFactory…
现在可以运行了:
string organizationName = String.Empty;
Google.GData.Apps.AdminSettings.AdminSettingsService service =
new Google.GData.Apps.AdminSettings.AdminSettingsService(auth.Domain, "myAppName");
service.RequestFactory =
new Google.GData.Client.GOAuth2RequestFactory("cl", "MyAppName",
new Google.GData.Client.OAuth2Parameters()
{ ClientId = ClientID,
ClientSecret = ClientSecret,
AccessToken = token });
try
{
var result = service.GetOrganizationName();
if (result != null)
{
organizationName = result.OrganizationName;
}
}
catch (Exception ex)
{
log.Error(ex);
}
return organizationName;
您正在使用正确的API。虽然GData被新的Google API所取代,但Admin Settings API目前仍使用旧的GData格式。
您是否使用超级管理员帐户进行身份验证?您可以在OAuth 2.0游乐场上尝试操作,看看它是否适用于那里的帐户吗?
你也可以看看Dito GAM,一个开源的Google Apps工具如何实现这个调用。如果创建一个名为debug。gam将打印出它正在发出/接收的所有原始HTTP调用和响应