我计划将Gearman作业服务器合并到我的网站架构中。我计划使用gearman完成的一项特别任务是对我的网站进行Facebook身份验证。
目前,我允许用户通过Facebook JS SDK授权我的Facebook应用程序登录到我的网站,在成功的身份验证后,我通过AJAX调用将用户的access_token发送到我的服务器,一旦服务器有access_token,它就会查询Facebook Graph API以获取当前用户的信息,我相应地设置用户的会话。我想把facebook API调用推到一个工作线程。
我会将作业发送给gearman,让gearman返回延迟的作业id,将该id发送回客户端的浏览器,并让浏览器以设置的间隔(约0.5或1.0秒)轮询服务器,通过将作业id返回给服务器并让它检查作业的完成状态来查看API调用是否已经完成。
我的问题是:与客户端共享内部作业标识符是否存在安全风险?
共享可能不是问题,但是由于用户将jobDd提交回服务器以检查状态,因此没有什么可以阻止用户更改jobId并获取其他身份验证尝试的状态。这可能不是问题(因为你可能不会返回任何其他内容),但你至少会向任何竞争对手泄露一些关于应用受欢迎程度的信息。
我建议简单地在服务器端生成一个随机密钥,并将作业id与该密钥关联起来,然后使用随机密钥在浏览器和服务器之间进行通信以请求当前状态。
客户机将获得随机密钥,然后使用它来请求当前任务的状态,而客户机和Gearman之间的服务器将在数据库中查找密钥,检索实际的jobId,然后查询Gearman。