我一直在为一个iOS应用程序设置苹果推送通知,使用的是JSON令牌而不是证书。
我可以生成一个JWT,并在应用程序中(使用Swift包)发出所需的POST请求,并发送通知。
我使用的是MongoDB领域,它具有从iOS应用程序调用的无服务器函数(在JavaScript中有一个Node环境)。一个计划好的触发器更新我的JWT,正如苹果建议的那样,每小时更新一次。
然而,尽管尝试了几个节点模块来发出POST请求,但始终存在错误(如“BadDeviceToken”或“InvalidProviderToken”)。
我终于让它使用节点-apn包工作了!但是,对于在这个无服务器的函数上下文中使用它,我有两个疑问:
Provider.shutdown()似乎并不会停止连接。我不认为我可以有一个长期运行的过程来接收未来的请求在一个无服务器的情况下。node-apn为您管理JWT,但是在一个无服务器的上下文中,它会在每次调用函数时生成一个新的令牌吗?每次我在开发模式下测试它(到Apple端点)时,都会发送通知。对于这些问题,以及node-apn是否适合在无服务器函数中使用,我将不胜感激。
更新
Provider.shutdown()不起作用似乎是一个公认的问题。
我可以通过这个解决办法关闭:
Provider.client.endpointManager._endpoints.forEach(endpoint => endpoint.destroy());
我仍然想知道,在无服务器的函数中使用这种方法是否合理。我担心JWT会被每一个请求刷新,而苹果可能不喜欢它!
发布于 2022-11-15 06:35:45
我已经浏览了苹果的相关文档,并对你关于在无服务器环境下刷新令牌的问题进行了一些思考。
根据Apple的文档,您可以想象以下确保刷新令牌不超过每20分钟一次、每小时至少刷新一次的方法:
createdAt时间戳字段一起使用)createdAt日期(或JWT本身上的iat字段)小于一个小时(或者在低于小时(例如50分钟)的阈值内),则在发送推送通知请求时重用令牌请注意:如果数据库(或apn_tokens集合)尚未访问,则只需要从受信任的源(即仅从云应用程序/函数)访问。客户端不应该以任何方式访问此表。您可以想象为您的无服务器环境设置集合级访问控制。作为额外的安全层,您可以想象在步骤1中重新生成后删除“过期”令牌,这样在任何时候表中只有一个令牌,以防止潜在的活动令牌在数据库中不使用而放置。
我希望这能帮到你!
https://stackoverflow.com/questions/74302405
复制相似问题