如何实现对twisted.pb中的备用凭证类型的支持?

时间:2011-03-26 05:48:18

标签: python twisted credentials perspective broker

我的项目一直在尝试使用scrypt来实施凭证检查程序。我们已经尝试实现自己的凭据和检查器对象,但是我们在使用它们时遇到了很多麻烦。

Pb似乎是硬编码在线上使用MD5哈希,这在我们的实现中绝对不起作用;我们没有办法在服务器端以明文形式获取正确的密码,因为我们正在使用scrypt,所以我们需要一种方法来传输密码以便用明文验证。我们尝试过使用twisted.cred.credentials.UsernamePassword和我们的凭证检查程序,但它似乎没有进入服务器。 (我们仍然得到_PortalAuthChallenger)

http://twistedmatrix.com/trac/ticket/4398处的票证似乎表明需要一个PBServerFactory子类才能支持pb中的自定义凭证检查器,但到目前为止,我完全无法弄清楚要覆盖的内容以便使用它一个不同的ICredentials实现。是否有任何示例(甚至只是文档)如何让pb使用不同的凭证类?

2 个答案:

答案 0 :(得分:4)

PB并不是完全硬编码在线上使用MD5哈希值;这只是当前实现的身份验证协议。通过实现自己的身份验证协议,您可以做任何您想做的事情 - 在PB中,这只是一个可以调用某些身份验证方法的对象。

创建自己的实现IPBRoot的对象,并将其传递给PBServerFactory。这只是意味着您需要实现一个名为rootObject的方法,该方法返回特定连接的根对象(当然,然后使用Zope接口声明该实现)。

您的IPBRoot实现应该包含Portal,类似于Twisted实现中的_PortalRoot

然后,对从适合您的应用程序的rootObject返回的对象创建一个远程方法;也许像remote_loginPlaintext这样的东西。在此方法中,您可以根据需要对用户进行身份验证,然后使用从该交互中获得的任何凭据调用特定login上的Portal,并了解您的要求(以及任何界面,尽管有明显的理由) ,IPerspective是我推荐的。

有点不灵活的_PortalRoot(仅支持2种凭据类型; IAnonymousIUsernamePassword)被注册为Portal的适配器,这使得它看起来像是比实际更正式。不要以为它是“官方”的PB / Cred整合机制,只是“默认”的一种。

如果您可以为PB提供更灵活的身份验证机制(可能是完整的SASL实现?),那么我们可以支持其他身份验证类型。我希望您在满足应用程序的特定需求时考虑这样做。

答案 1 :(得分:2)

这是我们提出的初步修复的链接:http://paste.skewedaspect.com/show/20/

请注意,这需要自定义凭据为可复制,并允许默认的MD5密钥交换行为由关键字arg useMD5Challenge控制。

注意:在我们的实现中,我们将检查完全留给Checker,并且我们的Credential对象只包含用户名和密码,因此没有实际代码被序列化。