Firestore错误请求的身份验证范围不足

时间:2019-08-18 10:51:38

标签: c# firebase google-api google-cloud-firestore google-oauth2

我正在尝试通过Google api身份验证进行首次使用Google Firestore。我要做的第一件事是用几个StartBatch方法的Set填充数据库,当我await批次Task时,它给了我这个错误:

Error: Status(StatusCode=PermissionDenied, Detail="Request had insufficient authentication scopes.") ;

关于使用Google进行身份验证以连接到Firestore的知识很少。首先,我使用Google控制台为我的应用程序提供的机密通过此方法进行身份验证:

    public async Task<GoogleOAuthState> GetUserCredentialAsync(string user = null, GoogleOAuthState oAuthState = null)
    {
        using (ClientSecretStream)
        {
            string credPath = System.Environment.GetFolderPath(
                System.Environment.SpecialFolder.Personal);

            if (oAuthState == null)
            {
                try
                {
                    var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(ClientSecretStream).Secrets,
                        _Scopes,
                        string.IsNullOrEmpty(user) ? "user" : user,
                        CTS.Token,
                        new FileDataStore(credPath, true));

                    return new GoogleOAuthState(credential, _AppName);
                }
                catch (Exception e)
                {
                    SetErrorMessage(e, "Error al intentar identificarse en google");
                    return null;
                }
            }
            else
            {
                try
                {
                    await GoogleWebAuthorizationBroker.ReauthorizeAsync(
                        oAuthState.Credential,
                        CTS.Token);
                    return oAuthState;
                }
                catch (Exception e)
                {
                    SetErrorMessage(e, "Error al intentar volver a identificarse en google");
                    return null;
                }
            }
        }
    }

使用在我的Google控制台中为该应用配置的相同范围(我在同一应用中使用Google驱动器)

            SheetsService.Scope.Spreadsheets
            DriveService.Scope.DriveFile
            DriveService.Scope.Drive
            DriveService.Scope.DriveAppdata
            DriveService.Scope.DriveMetadata
            "https://www.googleapis.com/auth/datastore"
            "https://www.googleapis.com/auth/cloud-platform"

GoogleOAuthState只是要保存并传递Credential的对象,而没有。 之后,我以此连接到Firestore:

    public async Task ConnectDB(GoogleLogin.GoogleOAuthState oAuthState)
    {
        var channelCredentials = oAuthState.Credential.ToChannelCredentials();
        var channel = new Channel(FirestoreClient.DefaultEndpoint.ToString(), channelCredentials);
        var client = FirestoreClient.Create(channel);
        _DB = FirestoreDb.Create(Properties.Settings.Default.FirebaseProjectName, client);
    }

我在this question中看到了该方法,并认为它是最可靠的。

与此同时,我已经设置了类似的Firestore规则:

service cloud.firestore {
match /databases/{database}/documents {
  match /{document=**} {
    allow read, write: if true;
    }
  }
}

Google身份验证正常,我可以正常使用Google驱动器。我还在Firestore控制台中添加了google作为身份验证方法,并添加了应用程序ID(我不确定这是否确实必要)。

我认为我误会了某件事...甚至有可能这样做吗?还是我必须使用服务帐户?

1 个答案:

答案 0 :(得分:-1)

根据我的测试和阅读,似乎无法通过桌面应用程序通过oAuth登录到Firestore:您使用服务帐户还是什么都没有。我什至不确定是否可以通过桌面应用程序进行签名,它既可以是移动应用程序,也可以是Web应用程序。

无论如何,即使有服务帐户,现在我还有另一个问题,所以我要提出另一个问题。