You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase启用安全规则后通过Volley发起请求?

解决Firebase数据库规则限制下Volley请求401/400错误的问题

问题根源

你当前的Volley请求头存在两个关键错误:

  • Authorization头格式错误:Firebase REST API要求用Bearer <ID_TOKEN>格式,而非auth_token="xxx"
  • 多余的无效header:把数据库规则字符串作为请求头键完全没必要,规则是在Firebase后台生效的,不需要在请求中传递

修复步骤

  1. 修正Authorization头格式
    把请求头里的Authorization值改成Bearer 加上你的用户ID Token,注意不要加多余引号。

  2. 删除无效的请求头
    直接移除params.put("auth != null && auth.uid != null && auth.token.email_verified == true", "");这一行。

  3. 确保获取的是有效ID Token
    不要直接用缓存的authToken,应该实时获取最新的ID Token(避免过期),代码示例:

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null && user.isEmailVerified()) {
        user.getIdToken(true)
            .addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    String idToken = task.getResult().getToken();
                    // 在这里发起Volley请求,使用这个idToken
                    sendVolleyRequest(idToken);
                } else {
                    // 处理获取Token失败的情况
                }
            });
    } else {
        // 用户未登录或邮箱未验证,引导用户处理
    }
    
  4. 验证用户邮箱状态
    在发起请求前必须确认用户邮箱已验证,否则即使Token正确,也会被Firebase规则拦截。

修改后的Volley请求代码

private void sendVolleyRequest(String idToken) {
    String url = DBLINK+"/users.json";
    StringRequest request = new StringRequest(Request.Method.GET, url, response -> {
        // 你的响应处理逻辑
        if(response.equals("null")){
            RegisterUserMyStyle();
        } else {
            try {
                JSONObject obj = new JSONObject(response);
                if(!obj.has(savedUsername)){
                    RegisterUserMyStyle();
                } else if(obj.getJSONObject(savedUsername).getString("password").equals(pass)){
                    Toast.makeText(Login.this, "登录成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(Login.this, "密码错误", Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        pd.dismiss();
    }, error -> {
        System.out.println("请求错误: " + error);
        pd.dismiss();
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            // 正确的Authorization头格式
            params.put("Authorization", "Bearer " + idToken);
            return params;
        }
    };

    RequestQueue rQueue = Volley.newRequestQueue(Login.this);
    rQueue.add(request);
}

额外注意事项

  • 确保你的Firebase Auth用户确实完成了邮箱验证,可以在Firebase控制台的用户列表里查看状态
  • ID Token有过期时间(默认1小时),所以每次发起请求前最好重新获取,避免因Token过期导致401错误

内容的提问来源于stack exchange,提问作者Franklyn Oreben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:32:16