2017-06-03 80 views
0

我从多线程Java应用程序调用VTiger(6.4)webservices。每次我需要调用Web服务时,我都会先从VT获取Challenge Token,然后登录并最终执行我的Query。Challenge Token在Vtiger Web Services中的真正用途是什么?

在回顾VT Web Services代码时,似乎上述内容不是“线程安全的”,因为一个线程获得的令牌将被第二个线程中获取的令牌覆盖在VT数据库中。如果Java应用程序恰巧在VT登录Web服务被调用时颠倒了线程的执行顺序,那么这些调用中的一个会失败,因为具有错误的标记。

我意识到,我可以我的应用程序中缓存令牌......但这意味着实现共享存储的互斥锁等

所以,我的问题是:是否挑战令牌远安真的添加到好vtiger的网页服务?或者,它可以被绕过吗?

回答

1

该令牌可防止您的会话被盗。该令牌的另一种选择是在每次调用中使用您的accessKey,但Vtiger Webservices不是以这种方式构建的。

如果修改vtiger的基本代码中的验证代码,它当然可以被忽略。至少你需要修改两个文件

vtiger_root/include/Webservices/AuthToken.php 

vtiger_root/include/Webservices/Login.php 

我想你应该分享跨线程一个令牌。也许使用单例来实现会话建立。

+0

谢谢鲁本。这很有帮助。我们希望使用VTiger作为标识提供程序,在几个应用程序(基于Java的Web应用程序和wordpress支持站点)上实施SSO。特别是Java应用程序可以跨多个服务器进行扩展。所以,建立会话单例不是非常直截了当。 – MSquared

+0

听起来很复杂。至于安全性,我不确定删除令牌会不太安全。听听你最终如何解决这个问题会很有趣。 –

+0

现在,我会'按原样'使用它,因为实际碰撞的几率很低。作为一个长期的解决方案:将我的Web服务切换到'preLogin',以便它不需要执行挑战/登录。然后,类似于Amazon S3所做的:添加'expires time'值作为附加请求参数。使用hmac和AccessKey签署请求的全部内容。发送符号和请求。在服务器上,使用AccessKey重新计算符号。如果符号正确(请求未被篡改)并且过期时间尚未到达,请执行该请求。也使它不那么“健谈” – MSquared