2011-03-26 77 views
3

我的项目一直在尝试使用scrypt来实现凭证检查器。我们尝试过实施我们自己的凭证和检查器对象,但是我们在使用pb时遇到了很多麻烦。应该如何支持twisted.pb中的备用凭证类型?

铅似乎硬编码为使用过线,这绝对不会在我们的实施工作MD5哈希值;我们没有办法在服务器端以纯文本的形式获取正确的密码,因为我们使用的是scrypt,所以我们需要一种方式来传输密码,以明文形式进行验证。我们已经尝试过使用twisted.cred.credentials.UsernamePassword和我们的凭证检查器,但它似乎没有将其传送到服务器。 (我们仍然使用_PortalAuthChallenger)

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

回答

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

看看_PortalRoot和例子,它看起来像IPBRoot实现不应该实际上被传递给PBServerFactory,而应该被注册为传递给PBServerFactory的适配器......这是正确的吗? 此外,它看起来像[PBClientFactory的_cbResponse](http://twistedmatrix.com/trac/browser/trunk/twisted/spread/pb.py#L1107)被编码以期望挑战/挑战者元组,并且[默认挑战者](http://twistedmatrix.com/trac/browser/trunk/twisted/spread/pb.py#L1331)在pb中使用MD5;不需要改变? – codermonkeyfuel 2011-03-28 00:36:39

+0

1:如果'x'提供'IFoo',IFoo(x)'将总是返回'x'。因此,如果您通过直接提供商,则无需注册适配器。 2:如果你在身份验证方面做了一些不同的服务器端,那么你必须做一些不同的客户端;你需要实现你自己的东西,就像PBClientFactory。 – Glyph 2011-03-28 01:12:55

2

下面是我们想出了初步修复的链接:http://paste.skewedaspect.com/show/20/

注意,这需要自定义凭证可拷贝,并允许通过关键字ARG useMD5Challenge控制缺省的MD5密钥交换行为。

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

相关问题