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