Как должна быть реализована поддержка альтернативных типов учетных данных в twisted.pb?

Мой проект пытался внедрить средство проверки учетных данных с использованием scrypt. Мы пытались реализовать свои собственные учетные данные и объекты проверки, но у нас было много проблем с тем, чтобы заставить pb их использовать.

Похоже, что Pb жестко закодирован для использования хэшей MD5 по сети, что абсолютно не будет работать в нашей реализации; у нас нет способа получить правильный пароль в открытом виде на стороне сервера, поскольку мы используем scrypt, поэтому нам нужен способ вместо этого передать пароль для проверки в виде открытого текста. Мы пытались использовать twisted.cred.credentials.UsernamePassword с нашим средством проверки учетных данных, но, похоже, оно не дошло до сервера. (вместо этого мы по-прежнему получаем _PortalAuthChallenger)

Билет на http://twistedmatrix.com/trac/ticket/4398, по-видимому, указывает на то, что Подкласс PBServerFactory необходим для поддержки пользовательских средств проверки учетных данных в pb, но до сих пор я совершенно не мог понять, что нужно переопределить, чтобы заставить его использовать другую реализацию ICredentials. Есть ли какие-либо примеры (или даже просто документация) того, как заставить pb использовать другой класс учетных данных?


person codermonkeyfuel    schedule 26.03.2011    source источник


Ответы (2)


PB не совсем жестко закодирован для использования хэшей MD5 по сети; это просто протокол аутентификации в том виде, в каком он реализован в настоящее время. Вы можете делать практически все, что хотите, реализуя свой собственный протокол аутентификации, что в PB означает просто объект, для которого вы можете вызывать некоторые методы аутентификации.

Создайте свой собственный объект, реализующий IPBRoot, и передайте его PBServerFactory. Это просто означает, что вам нужно реализовать метод с именем rootObject, который возвращает корневой объект для конкретного соединения (и затем объявить эту реализацию с интерфейсом Zope, конечно).

Ваша реализация IPBRoot должна заключать в себе Portal, как и _PortalRoot в реализации Twisted.

Затем создайте удаленный метод для объекта, возвращенного из rootObject, подходящего для вашего приложения; может что-то вроде remote_loginPlaintext. В этом методе вы можете аутентифицировать пользователей, как хотите, а затем вызвать login на своем конкретном Portal с любыми учетными данными, полученными в результате этого взаимодействия и имеющими смысл для ваших требований (и любым интерфейсом, хотя по очевидным причинам, IPerspective — это то, что я бы рекомендовал ).

Тот факт, что несколько негибкий _PortalRoot (который поддерживает только 2 типа учетных данных: IAnonymous и IUsernamePassword) зарегистрирован как адаптер для Portal, делает его более официальным, чем он есть на самом деле. Не думайте, что это «официальный» механизм интеграции PB/Cred, просто «по умолчанию».

Было бы здорово, если бы вы могли предоставить более гибкий механизм аутентификации (возможно, полную реализацию SASL?) для PB, чтобы мы могли поддерживать другие типы аутентификации. Я надеюсь, что вы подумаете об этом, когда будут удовлетворены конкретные потребности вашего приложения.

person Glyph    schedule 27.03.2011
comment
Глядя на _PortalRoot и примеры, похоже, что реализация IPBRoot на самом деле не должна передаваться в PBServerFactory, а вместо этого должна быть зарегистрирована как адаптер для того, что передается в PBServerFactory... это правильно? Кроме того, похоже, что PBClientFactory _cbResponse закодирован как ожидать кортеж вызова/претендента и вызов по умолчанию в pb используется MD5; не надо ли это менять? - person codermonkeyfuel; 28.03.2011
comment
1: IFoo(x) всегда будет возвращать x, если x предоставляет IFoo. Таким образом, нет необходимости регистрировать адаптер, если вы переходите к прямому провайдеру. 2: Если вы делаете что-то другое на стороне сервера с аутентификацией, то вам нужно делать что-то другое и на стороне клиента; вам нужно будет реализовать свою собственную вещь, похожую на PBClientFactory. - person Glyph; 28.03.2011