我开始在基于Flask的Web应用程序中使用Celery在服务器端运行异步任务。
多个资源获取一个'/ action'子资源,用户/客户端可以向其发送POST,包括指定操作的JSON主体,例如:
curl -H "Content-Type: application/json" -X POST \
-d '{"doPostprocessing": { "update": true}}}' \
"http://localhost:5000/api/results/123/action"
他们收到带有标题的202 ACCEPTED
回复
Location: http://localhost:5000/api/results/123/action/8c742418-4ade-474f-8c54-55deed09b9e5
他们可以轮询以获得最终结果(如果任务仍在运行,则可以获得另一个202 ACCEPTED
。)
我为此操作返回的ID是celery.result.AsyncResult.id
。
这是安全的吗?将Celery任务ID直接传递给公众时,我会创建哪些问题?
如果没有,是否有推荐的方法呢?最好是避免必须明确跟踪任务状态的一个。
答案 0 :(得分:1)
您可以使用任务ID。 Celery使用Kombu的uuid函数,默认情况下使用uuid4。 uuid4是随机生成的,而不是基于mac地址(uuid1是),因此将“足够随机”。
唯一的另一种方法是让API端点返回用户所有正在运行的任务的状态。即删除任何任务ID。但是,您将删除查询单个任务的功能。其他选项将有效地掩盖不同随机数背后的任务ID,因此您将遇到相同的暴力问题。
我建议您查看安全堆栈交换中的UUID问题(https://security.stackexchange.com/search?q=uuid)。其中一些无疑将等同于您正在寻找的东西。