如何在Firebase启用安全规则后通过Volley发起请求?
解决Firebase数据库规则限制下Volley请求401/400错误的问题
问题根源
你当前的Volley请求头存在两个关键错误:
- Authorization头格式错误:Firebase REST API要求用
Bearer <ID_TOKEN>格式,而非auth_token="xxx" - 多余的无效header:把数据库规则字符串作为请求头键完全没必要,规则是在Firebase后台生效的,不需要在请求中传递
修复步骤
修正Authorization头格式
把请求头里的Authorization值改成Bearer加上你的用户ID Token,注意不要加多余引号。删除无效的请求头
直接移除params.put("auth != null && auth.uid != null && auth.token.email_verified == true", "");这一行。确保获取的是有效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 { // 用户未登录或邮箱未验证,引导用户处理 }验证用户邮箱状态
在发起请求前必须确认用户邮箱已验证,否则即使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
相关产品推荐
相关产品推荐

