从 DirectoryService 收到权限不足错误
Receiving Insufficient Permission error from DirectoryService
我正在尝试设置 c# 代码来管理我们的 Google 域。
每当我从 DirectoryService api.api.
调用 service.Users.List() 或任何其他方法时,我都会收到此错误
Google.Apis.Requests.RequestError
Insufficient Permission [403]
Errors [
Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global]
]
我遵循了 OAuth 设置中的所有说明。我使用的帐户是域管理员。
我正在使用的客户端机密文件在与 GAM.exe 一起使用时可以正常工作以执行相同的操作。这让我相信我的代码做错了。
下面是我查询用户的代码,有什么遗漏吗?
static void Main(string[] args)
{
var applicationName = "App Project Name";
var userName = "admin@domain.com";
var clientID = "clientIDfromAPIcredentialpageonconsole.developers.google.com";
UserCredential credential;
using (var stream = new FileStream("C:\gam\client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
userName,
CancellationToken.None, null).Result;
}
var service = new DirectoryService(new BaseClientService.Initializer()
{
ApplicationName = applicationName,
HttpClientInitializer = credential
});
var list = service.Users.List();
var users = list.Execute();
}
}
2 个选项:
- 您没有包含正确的范围。你确定DirectoryService.Scope.AdminDirectoryOrgunit、DirectoryService.Scope.AdminDirectoryUser够了吗?
- 您是否在控制台中启用了 API?如需更多信息,请访问:https://developers.google.com/api-client-library/dotnet/get_started#auth, Look for your project in https://console.cloud.google.com/project 并确保您启用了目录管理 API。
如果这些选项之一有效或您仍然缺少其他选项,请更新此线程。
这是我的工作凭证代码:
using (var stream =
new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json");
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new string[] { CalendarService.Scope.Calendar },
"username@gmail.com",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Console.WriteLine("Credential file saved to: " + credPath);
}
确保在控制台中启用 API,
作用域
看来你正在尝试这个 Quickstart:
但是,该教程中使用的范围是:
new [] { DirectoryService.Scope.AdminDirectoryUserReadonly };
但是,在您发布的代码中,您有:
new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
代币
更改范围后(如上所示),您可能必须删除 OAuth2 令牌,然后重新授权您的应用程序访问。 (除非您还没有完成 "authorize access" 步骤。)
\token.json\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user
启用APIs
此外,正如我认为您已经发现的那样,启用目录 API 与启用 Gmail API 的过程不同(在不同的 URL 中找到)
url https://developers.google.com/gmail/api/quickstart/dotnet 的文档将范围设置为
静态字符串[]范围={GmailService.Scope.GmailReadonly};将其设置为 GmailService.Scope.MailGoogleCom,然后按照 document.It 中指定的流程继续操作真是太可惜了,我正在编辑令牌响应文件中的范围
我正在尝试设置 c# 代码来管理我们的 Google 域。
每当我从 DirectoryService api.api.
调用 service.Users.List() 或任何其他方法时,我都会收到此错误Google.Apis.Requests.RequestError
Insufficient Permission [403]
Errors [
Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global]
]
我遵循了 OAuth 设置中的所有说明。我使用的帐户是域管理员。
我正在使用的客户端机密文件在与 GAM.exe 一起使用时可以正常工作以执行相同的操作。这让我相信我的代码做错了。
下面是我查询用户的代码,有什么遗漏吗?
static void Main(string[] args)
{
var applicationName = "App Project Name";
var userName = "admin@domain.com";
var clientID = "clientIDfromAPIcredentialpageonconsole.developers.google.com";
UserCredential credential;
using (var stream = new FileStream("C:\gam\client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
userName,
CancellationToken.None, null).Result;
}
var service = new DirectoryService(new BaseClientService.Initializer()
{
ApplicationName = applicationName,
HttpClientInitializer = credential
});
var list = service.Users.List();
var users = list.Execute();
}
}
2 个选项:
- 您没有包含正确的范围。你确定DirectoryService.Scope.AdminDirectoryOrgunit、DirectoryService.Scope.AdminDirectoryUser够了吗?
- 您是否在控制台中启用了 API?如需更多信息,请访问:https://developers.google.com/api-client-library/dotnet/get_started#auth, Look for your project in https://console.cloud.google.com/project 并确保您启用了目录管理 API。
如果这些选项之一有效或您仍然缺少其他选项,请更新此线程。
这是我的工作凭证代码:
using (var stream =
new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json");
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new string[] { CalendarService.Scope.Calendar },
"username@gmail.com",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Console.WriteLine("Credential file saved to: " + credPath);
}
确保在控制台中启用 API,
作用域
看来你正在尝试这个 Quickstart:
但是,该教程中使用的范围是:
new [] { DirectoryService.Scope.AdminDirectoryUserReadonly };
但是,在您发布的代码中,您有:
new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
代币
更改范围后(如上所示),您可能必须删除 OAuth2 令牌,然后重新授权您的应用程序访问。 (除非您还没有完成 "authorize access" 步骤。)
\token.json\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user
启用APIs
此外,正如我认为您已经发现的那样,启用目录 API 与启用 Gmail API 的过程不同(在不同的 URL 中找到)
url https://developers.google.com/gmail/api/quickstart/dotnet 的文档将范围设置为 静态字符串[]范围={GmailService.Scope.GmailReadonly};将其设置为 GmailService.Scope.MailGoogleCom,然后按照 document.It 中指定的流程继续操作真是太可惜了,我正在编辑令牌响应文件中的范围