Google.Apis.Requests.RequestError请求的身份验证范围不足。 GCP for Firebase管理API中的[403]

时间:2018-12-14 04:46:20

标签: c# firebase google-cloud-platform

我尝试使用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;
    }

感谢所有帮助我的人,我解决了此问题。 再次感谢。 :)

4 个答案:

答案 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变量定义的文件夹中。请注意,如果您要在运行应用一次后更改范围,则该身份验证数据不会被覆盖,因此您必须:

  1. 每次运行应用程序之前,都删除此现有数据
  2. 更改credPath
  3. 或仅删除此参数,但是在这种情况下,每次启动应用程序时都必须确认您的身份验证。

答案 3 :(得分:0)

您首先必须将范围设置为Calendar(因为这是拥有最多权限的范围,所以您还必须:CalendarEvents,CalendarEventsReadonly,CalendarReadonly,CalendarSettingsReadonly根据所需的权限级别选择所需的范围),像这样:

>
        static string[] Scopes = {CalendarService.Scope.Calendar};

但是这没有完成,因为您需要删除已经创建的凭据路径或更改其名称,在文档中其名称为“ token.json”,就好像您已经离开了用户已经同意的特定名称一样访问他的数据,但是现在,如果您删除此文件或更改了文件,将提示他进入浏览器上的新窗口,以接受对他的数据的新访问(在Scope.Calendar范围的情况下,将提示他接受我们有权获取,插入,更新和删除他日历上的事件)