我的项目一直在尝试使用scrypt来实施凭证检查程序。我们已经尝试实现自己的凭据和检查器对象,但是我们在使用它们时遇到了很多麻烦。
Pb似乎是硬编码在线上使用MD5哈希,这在我们的实现中绝对不起作用;我们没有办法在服务器端以明文形式获取正确的密码,因为我们正在使用scrypt,所以我们需要一种方法来传输密码以便用明文验证。我们尝试过使用twisted.cred.credentials.UsernamePassword和我们的凭证检查程序,但它似乎没有进入服务器。 (我们仍然得到_PortalAuthChallenger)
http://twistedmatrix.com/trac/ticket/4398处的票证似乎表明需要一个PBServerFactory子类才能支持pb中的自定义凭证检查器,但到目前为止,我完全无法弄清楚要覆盖的内容以便使用它一个不同的ICredentials实现。是否有任何示例(甚至只是文档)如何让pb使用不同的凭证类?
答案 0 :(得分:4)
PB并不是完全硬编码在线上使用MD5哈希值;这只是当前实现的身份验证协议。通过实现自己的身份验证协议,您可以做任何您想做的事情 - 在PB中,这只是一个可以调用某些身份验证方法的对象。
创建自己的实现IPBRoot
的对象,并将其传递给PBServerFactory
。这只是意味着您需要实现一个名为rootObject
的方法,该方法返回特定连接的根对象(当然,然后使用Zope接口声明该实现)。
您的IPBRoot
实现应该包含Portal
,类似于Twisted实现中的_PortalRoot
。
然后,对从适合您的应用程序的rootObject
返回的对象创建一个远程方法;也许像remote_loginPlaintext
这样的东西。在此方法中,您可以根据需要对用户进行身份验证,然后使用从该交互中获得的任何凭据调用特定login
上的Portal
,并了解您的要求(以及任何界面,尽管有明显的理由) ,IPerspective
是我推荐的。
有点不灵活的_PortalRoot
(仅支持2种凭据类型; IAnonymous
和IUsernamePassword
)被注册为Portal
的适配器,这使得它看起来像是比实际更正式。不要以为它是“官方”的PB / Cred整合机制,只是“默认”的一种。
如果您可以为PB提供更灵活的身份验证机制(可能是完整的SASL实现?),那么我们可以支持其他身份验证类型。我希望您在满足应用程序的特定需求时考虑这样做。
答案 1 :(得分:2)
这是我们提出的初步修复的链接:http://paste.skewedaspect.com/show/20/
请注意,这需要自定义凭据为可复制,并允许默认的MD5密钥交换行为由关键字arg useMD5Challenge控制。
注意:在我们的实现中,我们将检查完全留给Checker,并且我们的Credential对象只包含用户名和密码,因此没有实际代码被序列化。