Android应用发送Parse推送通知时提示'MasterKey未授权'问题求助
问题根源分析
你遇到的unauthorized: master key is required错误,核心原因是Parse Server不允许客户端直接调用推送发送接口——因为发送推送需要使用Master Key,而Master Key绝对不能在客户端代码中暴露(会导致严重安全风险,比如被恶意用户滥用发送垃圾推送)。
你的云函数里虽然已经正确添加了useMasterKey: true,但你并没有通过云函数来触发推送,而是直接在Android客户端调用了ParsePush.sendInBackground(),这才是报错的关键。
修复步骤
1. 修正云函数:将触发器改为可调用云函数
你当前的云函数是afterSave触发器(仅当SendPush类的对象被保存时自动执行),但你需要的是一个可以主动调用的云函数。修改main.js中的代码:
// 替换原来的afterSave为define,定义一个可主动调用的云函数 Parse.Cloud.define("sendPushNotification", function(request) { const message = request.params.message; // 接收客户端传入的推送内容 const channel = request.params.channel; // 接收客户端传入的目标频道 var query = new Parse.Query(Parse.Installation); query.exists("deviceToken"); if (channel) { query.equalTo("channels", channel); // 按指定频道筛选接收设备 } var payload = { alert: message }; return Parse.Push.send({ data: payload, where: query }, { useMasterKey: true }) .then(function() { return "Push Sent Successfully!"; }, function(error) { throw new Error("Error sending push: " + error.message); }); });
2. 修改Android客户端代码:调用云函数发送推送
移除客户端直接调用ParsePush的代码,改为调用上面定义的云函数:
btnEnviar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Mensaje m = new Mensaje(); m.guardar(txtMensajes.getText().toString(), nombre.getText().toString(), "", "1", "00:00"); adapter.addMensaje(m); listMensajes.add(m); m.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { Toast.makeText(MainActivity.this, "Successfully created message on Parse", Toast.LENGTH_SHORT).show(); actualizarMensajes(); // 调用云函数发送推送 HashMap<String, Object> params = new HashMap<>(); params.put("message", m.getMensaje()); params.put("channel", CANALPRINCIPAL); ParseCloud.callFunctionInBackground("sendPushNotification", params, new FunctionCallback<String>() { @Override public void done(String result, ParseException e) { if (e == null) { System.out.println("PUSH enviado correctamente: " + result); } else { System.out.println("Fallo en el PUSH"); System.out.println(e.getMessage()); System.out.println(e.getCode()); } } }); } else { Log.e(MainActivity.class.getSimpleName(),"Failed to save message", e); } } }); txtMensajes.setText(""); } });
3. 额外检查项
- 确保你的Parse Server配置中,
push模块已正确启用,并且Android推送所需的Firebase API密钥/证书已配置完成。 - 绝对不要在客户端代码中添加任何与Master Key相关的配置,Master Key只能在云函数或服务器端代码中使用。
这样调整后,推送请求会通过云函数安全处理,云函数使用Master Key完成推送发送,既符合Parse Server的安全规范,也能解决你遇到的权限错误。
内容的提问来源于stack exchange,提问作者Harold Barrera
相关产品推荐
相关产品推荐

