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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:28:17