larksuite / oapi-sdk-java

Apache License 2.0
236 stars 87 forks source link

后台不设置verificationToken时,CardActionHandler无法完成机器人url验证功能 #138

Closed kennywgx closed 2 months ago

kennywgx commented 2 months ago

image 我的机器人不设置verificationToken,sdk应该支持传null或者"",如果按下面代码传null,会报空指针,如果传"", 则token不匹配

cardActionHandler = CardActionHandler.newBuilder(null, null,
        cardAction -> {
             // 返回challenge字段完成后台url验证
             return Maps.immutableEntry("challenge", cardAction.getChallenge());
        }
).build();
/*
验证url时报错:
java.lang.NullPointerException: null
at com.lark.oapi.card.CardActionHandler.handle(CardActionHandler.java:126)
at com.lark.oapi.sdk.servlet.ext.ServletAdapter.handleCardAction(ServletAdapter.java:51)
*/

我看了(CardActionHandler.java:126)处的代码,发现sdk这里少了token判空的处理逻辑: image

maemual commented 2 months ago

verificationToken 是必须的,不能没有。

kennywgx commented 2 months ago

@maemual 可是后台可以不设置verificationToken啊,因为机器人比较多,之前没用sdk的时候自己解析这种情况是可以通过验证的,机器人比较多就这样用了,中间换成了sdk,一切业务处理逻辑都正常,但是现在有新的机器人就发现这个url配不上去了

kennywgx commented 2 months ago

下面都有判空了,希望这里上面(CardActionHandler.java:126)这里也判空一下,!empty && !equal的时候抛出验证不通过

maemual commented 2 months ago

@maemual 可是后台可以不设置verificationToken啊,因为机器人比较多,之前没用sdk的时候自己解析这种情况是可以通过验证的,机器人比较多就这样用了,中间换成了sdk,一切业务处理逻辑都正常,但是现在有新的机器人就发现这个url配不上去了

验证机制要求必须有verificationToken,否则没法认证你的 url 的身份的合法性。

kennywgx commented 2 months ago

@maemual 可是后台可以不设置verificationToken啊,因为机器人比较多,之前没用sdk的时候自己解析这种情况是可以通过验证的,机器人比较多就这样用了,中间换成了sdk,一切业务处理逻辑都正常,但是现在有新的机器人就发现这个url配不上去了

验证机制要求必须有verificationToken,否则没法认证你的 url 的身份的合法性。

hi,我仔细思考了下,url都我自己配置的,而且我们是自己内部应用,我也明白我这个设置的风险,但是选择权应该在用户手里,出于历史原因在迁移sdk时还需要兼容以前的老代码,所以希望延用没有token的机器人,既然后台支持这个设置,那sdk就应该兼容,希望你能明白维护老代码就是会存在一些不是那么理想的场景(我也想吐血)。

而且,代码里“验签”的逻辑是支持token为空的,我们代码没有token也跑了很久了没问题,不支持null token的仅仅是填url这里的challenge验证操作而已,所以目前这个限制,仅仅作用于“我验证我自己url的合法性“这个场景,并没有真正起到多大的作用

maemual commented 2 months ago

我重新找业务方确认了一下逻辑,并且实验测试一下,两个参数都设置空字符串,是可以正常验证通过的。

image
kennywgx commented 2 months ago

我重新找业务方确认了一下逻辑,并且实验测试一下,两个参数都设置空字符串,是可以正常验证通过的。

image

之前我同事说verificationToken=""会报challenge不匹配,但我刚测试了是可以通过的,谢谢~