Firebase实时数据库在尝试进行身份验证时返回401?

Firebase实时数据库在尝试进行身份验证时返回401?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我正在应用程序中使用RESTAPI与Firebase RTDB通信,并尝试使用Google访问令牌验证我的请求 我的问题是,即使使用数据库中最允许的规则,我也会收到HTTP错误401,以响应尝试进行身份验证的查询 例如,假设我尝试使用以下命令将一些数据放入数据库中,我将得到401(其中的所有值都是占位符): curl-XPUT-d'{“UserID”:“UserName”:“Clicksurfer”,“CompletionMoves”:8,“CompletionTime”:16.21979}'h

我正在应用程序中使用RESTAPI与Firebase RTDB通信,并尝试使用Google访问令牌验证我的请求

我的问题是,即使使用数据库中最允许的规则,我也会收到HTTP错误401,以响应尝试进行身份验证的查询

例如,假设我尝试使用以下命令将一些数据放入数据库中,我将得到401(其中的所有值都是占位符):

curl-XPUT-d'{“UserID”:“UserName”:“Clicksurfer”,“CompletionMoves”:8,“CompletionTime”:16.21979}'https://.firebaseio.com/Level2/.json/?access_token=

401

最奇怪的是,当我完全放弃使用访问令牌时,查询工作:

curl-XPUT-d'{“UserID”:“UserName”:“Clicksurfer”,“CompletionMoves”:8,“CompletionTime”:16.21979}'https://.firebaseio.com/Level2/.json

200

正如我所说,我目前正在使用最宽松的调试规则:

{
    "rules": {
      ".read": true,
      ".write": true
    }
}
你知道是什么引起的吗?提前谢谢


编辑:

在我的项目中,除其他外,我使用AuthCode

为了做到这一点,我需要做几件事:

  • 在启动期间为Google Play Games构建配置时,我确保调用
    RequestServerAuthCode(false)
    方法
  • 在Google Play Games设置后让用户登录
  • 确保相关的ClientID已提供给Unity(在本例中,它是对我的Firebase rtdb具有auth权限的web客户端)
  • 这一切看起来都是这样的:

    public class GPGSAuthentication : MonoBehaviour
    {
        public static PlayGamesPlatform platform;
    
        void Start()
        {
            if (platform == null)
            {
                PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().RequestServerAuthCode(false).Build();
                PlayGamesPlatform.InitializeInstance(config);
                PlayGamesPlatform.DebugLogEnabled = true;
    
                platform = PlayGamesPlatform.Activate();
            }
    
            Social.Active.localUser.Authenticate(success =>
            {
                if (success)
                {
                    Debug.Log("GSPS - Logged in successfully");
                }
                else
                {
                    Debug.Log("GSPS - Falied to login");
                }
            });
        }
    }
    

    现在我们已经完成了这项工作,可以调用
    PlayGamesPlatform.Instance.GetServerAuthCode()
    来获取AuthCode

    我通过发送POST请求到
    https://www.googleapis.com/oauth2/v4/token
    。在我的查询中,我提供了4个字段:

    • client\u id
      ,它具有以前使用的客户端的id(我们从中获取AuthCode)
    • client\u secret
      ,它具有相关的秘密
    • grant\u type
      ,它总是带有值
      “authorization\u code”
    • code
      ,它具有我们获得的AuthCode的值
    作为响应,我得到一个带有4个参数的
    200
    响应:

    • access\u token
      ,针对我的Firebase rtdb进行身份验证时我(未能)使用的令牌
    • 令牌类型
      ,上述令牌的类型
    • expires\u在
      中,令牌过期之前的时间量(我假定以秒为单位)
    • refresh\u-token
      ,一种可以用来获取新的
      access\u-token
      的令牌,无需保持Google用户的连接

    然后,我将此
    access\u token
    值提供给我发送给数据库的查询,并立即获得
    401
    错误。

    您的访问令牌似乎无效。你是如何生成的?嗨,弗兰克,我通过交易一个身份验证码来生成访问令牌,这个身份验证码是在用户通过身份验证(登录)后从Google Play Services获得的。要查看我所做的全部过程,请。我为Unity使用GooglePlay服务包,并通过RESTAPI做其他事情。“我从GooglePlay服务获得的”听起来有点可疑。你能展示一下你如何确定你为
    GOOGLE\u ACCESS\u TOKEN
    传递的确切值的代码吗?不用担心,@frankvanpoffelen我编辑了我的原始帖子,因为有很多信息要提供-请查看编辑部分下的所有内容。谢谢:)这绝对是一个OAuth2令牌,而不是JWT,这意味着它只会被数据库接受,如果它是为项目上的合作者或服务帐户提供的。我不确定您是否可以按原样将此OAuth令牌与RTDB一起使用。你有没有在任何地方读到这应该有效?你的访问令牌似乎无效。你是如何生成的?嗨,弗兰克,我通过交易一个身份验证码来生成访问令牌,这个身份验证码是在用户通过身份验证(登录)后从Google Play Services获得的。要查看我所做的全部过程,请。我为Unity使用GooglePlay服务包,并通过RESTAPI做其他事情。“我从GooglePlay服务获得的”听起来有点可疑。你能展示一下你如何确定你为
    GOOGLE\u ACCESS\u TOKEN
    传递的确切值的代码吗?不用担心,@frankvanpoffelen我编辑了我的原始帖子,因为有很多信息要提供-请查看编辑部分下的所有内容。谢谢:)这绝对是一个OAuth2令牌,而不是JWT,这意味着它只会被数据库接受,如果它是为项目上的合作者或服务帐户提供的。我不确定您是否可以按原样将此OAuth令牌与RTDB一起使用。你有没有在任何地方读到这本应该有用的书?