我尝试使用resourcemanager.projects.create创建一个新项目,但是出现了类似:(
Google.Apis.Requests.RequestError
Request had insufficient authentication scopes. [403]
Errors [
Message[Request had insufficient authentication scopes.] Location[ - ] Reason[forbidden] Domain[global]
]
任何人都可以告诉我我在做什么错。 这是我的代码:
private async void GoogleClick(object sender, RoutedEventArgs e)
{
try
{
var cr = new PromptCodeReceiver();
var result = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets { ClientId = GoogleClientId,ClientSecret = GoogleSecretKey },
new[] { "email", "profile" },
"user",
CancellationToken.None);
if (result.Token.IsExpired(SystemClock.Default))
{
await result.RefreshTokenAsync(CancellationToken.None);
}
CloudResourceManagerService cloudResourceManagerService = new CloudResourceManagerService(new BaseClientService.Initializer
{
HttpClientInitializer = GetCredential(result.Token.AccessToken, FirebaseAuthType.Google),
ApplicationName = "Kapiling",
//ApiKey = "apikey"
});
// TODO: Assign values to desired properties of `requestBody`:
Data.Project requestBody = new Data.Project();
requestBody.Name = "TESTING";
requestBody.ProjectNumber = 415104041262;
requestBody.ProjectId = "tokyo-rain-123";
requestBody.CreateTime = "2014-10-02T15:01:23.045123456Z";
ProjectsResource.CreateRequest request = cloudResourceManagerService.Projects.Create(requestBody);
}
我尝试使用公共静态GoogleCredential FromAccessToken(string accessToken,IAccessMethod accessMethod = null)进行访问;方法
public static GoogleCredential GetCredential(string accessToken, FirebaseAuthType authType)
{
GoogleCredential credential = GoogleCredential.FromAccessToken(accessToken, null);
return credential;
}
感谢所有帮助我的人,我解决了此问题。 再次感谢。 :)
答案 0 :(得分:0)
通过查看GCP文档,您似乎也需要-O3
范围。参见https://cloud.google.com/resource-manager/docs/authorizing
答案 1 :(得分:0)
更改GetCredential()
的代码。注意:我不确定您要使用FirebaseAuthType
做什么,所以我将authType
保留为未使用的参数。
public static GoogleCredential GetCredential(string accessToken, FirebaseAuthType authType)
{
GoogleCredential credential = GoogleCredential.FromAccessToken(accessToken, null);
// The following line is no longer needed
// credential = credential.CreateScoped("https://www.googleapis.com/auth/cloud-platform");
return credential;
}
[EDIT]:由于评论createScopedRequired = false
您收到此消息是因为您已经使用范围进行了身份验证。更改范围需要其他授权。在这种情况下,请请求正确的范围。注意,您不需要其他范围(电子邮件和个人资料)。以后再放回去。
string[] scopes = new string[] { "https://www.googleapis.com/auth/cloud-platform" };
var result = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets {
ClientId = GoogleClientId,
ClientSecret = GoogleSecretKey },
scopes,
"user",
CancellationToken.None).Result;
答案 2 :(得分:0)
此问题是由错误的授权范围引起的,这是正确的。对于这种特殊情况,解决方案是仅在正确的范围(首选)下进行一次授权,或者在需要编写/更新/追加时在每种情况下进行授权。
但是,作者仅评论该问题已解决,而未描述解决方案。在许多情况下,以官方API文档为指导,您可以看到此代码
const string credPath = "token.json";
credential = GoogleWebAuthorizationBroker
.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true))
.Result;
在这些示例中,您指定最后一个参数以将某些身份验证数据保存到credPath变量定义的文件夹中。请注意,如果您要在运行应用一次后更改范围,则该身份验证数据不会被覆盖,因此您必须:
答案 3 :(得分:0)
您首先必须将范围设置为Calendar(因为这是拥有最多权限的范围,所以您还必须:CalendarEvents,CalendarEventsReadonly,CalendarReadonly,CalendarSettingsReadonly根据所需的权限级别选择所需的范围),像这样:
> static string[] Scopes = {CalendarService.Scope.Calendar};
但是这没有完成,因为您需要删除已经创建的凭据路径或更改其名称,在文档中其名称为“ token.json”,就好像您已经离开了用户已经同意的特定名称一样访问他的数据,但是现在,如果您删除此文件或更改了文件,将提示他进入浏览器上的新窗口,以接受对他的数据的新访问(在Scope.Calendar范围的情况下,将提示他接受我们有权获取,插入,更新和删除他日历上的事件)