Ошибки с python-openid и интегрированным входом в Google Apps

ОБНОВИТЬ

Мне удалось заставить его работать, хотя я не совсем уверен, почему;) Похоже, что python-openid использует POST-запрос для выдачи openid mode = associate, и по какой-то причине Google это не нравится. Когда я пропатчил python-openid, чтобы вместо этого использовать GET-запрос, все работало нормально. Я продолжу свое расследование и обновлю этот пост, когда у меня будет дополнительная информация. Ниже приведена разница для моего изменения.

--- python-openid-2.2.1.orig/openid/consumer/consumer.py
+++ python-openid-2.2.1/openid/consumer/consumer.py
@@ -229,6 +229,20 @@
     # Process response in separate function that can be shared by async code.
     return _httpResponseToMessage(resp, server_url)

+def makeKVGet(request_message, server_url):
+    """Make a Direct Request to an OpenID Provider and return the
+    result as a Message object.
+
+    @raises openid.fetchers.HTTPFetchingError: if an error is
+        encountered in making the HTTP post.
+
+    @rtype: L{openid.message.Message}
+    """
+    # XXX: TESTME
+    resp = fetchers.fetch(request_message.toURL(server_url))
+
+    # Process response in separate function that can be shared by async code.
+    return _httpResponseToMessage(resp, server_url)

 def _httpResponseToMessage(response, server_url):
     """Adapt a POST response to a Message.
@@ -682,6 +696,7 @@
         return True

     _makeKVPost = staticmethod(makeKVPost)
+    _makeKVGet = staticmethod(makeKVGet)

     def _checkSetupNeeded(self, message):
         """Check an id_res message to see if it is a
@@ -1258,7 +1273,7 @@
             endpoint, assoc_type, session_type)

         try:
-            response = self._makeKVPost(args, endpoint.server_url)
+            response = self._makeKVGet(args, endpoint.server_url)
         except fetchers.HTTPFetchingError, why:
             oidutil.log('openid.associate request failed: %s' % (why[0],))
             return None

Старый вопрос, сохраненный для контекста

Я отчаянно пытался заставить работать плагин trac-authopenid, но безуспешно .

Мы используем Google Apps Premier на работе, поэтому я пытаюсь заставить openid auth работать с этим. Я думаю, что я настроил все необходимые вещи (XRDS и тому подобное), что касается Google, и у меня все нормально работает с apache2 + mod-auth-openid, а также использовать его на других сайтах (например, SO).

Но я не могу заставить его работать с trac-authopenid. Меня перенаправляют (через сообщение формы, а не перенаправление, как обычно) в Google, где я могу войти в систему, но когда я возвращаю плагин, плагин просто заявляет, что проверка не удалась.

Если я включу ведение журнала отладки, я получу это (я заменил наше доменное имя на example.com)

2010-01-27 12:21:15,811 Trac[authopenid] DEBUG: beginning OpenID authentication.
2010-01-27 12:21:16,866 Trac[authopenid] DEBUG: kvToSeq warning: Line 1 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
2010-01-27 12:21:16,866 Trac[authopenid] DEBUG: kvToSeq warning: Line 2 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
2010-01-27 12:21:16,866 Trac[authopenid] DEBUG: kvToSeq warning: Line 3 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
    ... snipped, repeats until line 9...
2010-01-27 12:21:16,867 Trac[authopenid] DEBUG: openid.associate request failed: bad status code from server https://www.google.com/a/example.com/o8/ud?be=
2010-01-27 12:21:16,868 Trac[authopenid] DEBUG: _get_trust_root href: /trac
2010-01-27 12:21:16,868 Trac[authopenid] DEBUG: _get_trust_root abs_href: https://developer.example.com/trac
2010-01-27 12:21:16,868 Trac[authopenid] DEBUG: _get_trust_root href: /trac
2010-01-27 12:21:16,868 Trac[authopenid] DEBUG: _get_trust_root abs_href: https://developer.example.com/trac
2010-01-27 12:21:16,869 Trac[authopenid] DEBUG: Generated checkid_setup request to https://www.google.com/a/example.com/o8/ud?be=o8 using stateless mode.
2010-01-27 12:21:18,068 Trac[main] DEBUG: Dispatching <Request "GET u'/openidprocess'">
2010-01-27 12:21:18,075 Trac[session] DEBUG: Retrieving session for ID '25a842642693232301aad341'
2010-01-27 12:21:18,078 Trac[authopenid] DEBUG: Error attempting to use stored discovery information: <openid.consumer.consumer.TypeURIMismatch: Required ty
2010-01-27 12:21:18,078 Trac[authopenid] DEBUG: Attempting discovery to verify endpoint
2010-01-27 12:21:18,078 Trac[authopenid] DEBUG: Performing discovery on http://example.com/openid?id=113663311178245814720
2010-01-27 12:21:18,121 Trac[authopenid] DEBUG: Received id_res response from https://www.google.com/a/example.com/o8/ud?be=o8 using association AOQobUefon
2010-01-27 12:21:18,121 Trac[authopenid] DEBUG: Using OpenID check_authentication
2010-01-27 12:21:18,121 Trac[authopenid] DEBUG: op_endpoint
2010-01-27 12:21:18,121 Trac[authopenid] DEBUG: claimed_id
2010-01-27 12:21:18,121 Trac[authopenid] DEBUG: identity
2010-01-27 12:21:18,122 Trac[authopenid] DEBUG: return_to
2010-01-27 12:21:18,122 Trac[authopenid] DEBUG: response_nonce
2010-01-27 12:21:18,122 Trac[authopenid] DEBUG: assoc_handle
2010-01-27 12:21:18,576 Trac[authopenid] DEBUG: kvToSeq warning: Line 1 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
2010-01-27 12:21:18,577 Trac[authopenid] DEBUG: kvToSeq warning: Line 2 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
2010-01-27 12:21:18,577 Trac[authopenid] DEBUG: kvToSeq warning: Line 3 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n
    ... snipped, repeats until line 9...
2010-01-27 12:21:18,578 Trac[authopenid] DEBUG: check_authentication failed: bad status code from server https://www.google.com/a/example.com/o8/ud?be=o8: 501

Я попытался написать код непосредственно для библиотеки python-openid, чтобы немного сузить ее, но Я невежественен. Мне удалось воспроизвести ошибку с помощью этого фрагмента кода:

from openid.store.memstore import MemoryStore
from openid.consumer import consumer

session = { 'id' : 'foobar' }
store = MemoryStore()
consumer = consumer.Consumer(session, store)
consumer.begin('https://www.google.com/accounts/o8/site-xrds?hd=example.com')

Что последовательно выводит

kvToSeq warning: Line 1 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n<H1>Not Implemented</H1>\n<H2>Error 501</H2>\n</BODY>\n</HTML>\n'
kvToSeq warning: Line 2 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n<H1>Not Implemented</H1>\n<H2>Error 501</H2>\n</BODY>\n</HTML>\n'
kvToSeq warning: Line 3 does not contain a colon: '<HTML>\n<HEAD>\n<TITLE>Not Implemented</TITLE>\n</HEAD>\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n<H1>Not Implemented</H1>\n<H2>Error 501</H2>\n</BODY>\n</HTML>\n'
... snip ...
openid.associate request failed: bad status code from server https://www.google.com/a/example.com/o8/ud?be=o8: 501

Некоторые номера версий:

Python 2.6.2
trac-authopenid 0.1.6
python-openid 2.2.1

Я в полной растерянности, и мне действительно нужна помощь.


person Markus Olsson    schedule 27.01.2010    source источник
comment
Почему google.com/accounts/o8/site-xrds?hd = example.com вместо google.com/accounts/o8/id?   -  person keturn    schedule 27.01.2010
comment
Я собирался сказать вам отправить этот патч на trac.openidenabled.com, если он окажется необходимым , в связи с чем возникает вопрос: работает ли ваш OpenID с установкой той трассировки?   -  person keturn    schedule 27.01.2010
comment
@keturn: поскольку мы используем учетную запись Google Apps (или «размещенные» учетные записи, как ее иногда называют), это не моя личная учетная запись Google. У всех сотрудников моей компании есть учетная запись, используемая для доступа к почте, документам и т. Д. См. code.google.com/intl/en-US/apis/apps/sso/ Похоже, делегаты trac.openidenabled.com используют rpxnow для аутентификации, и это прекрасно работает.   -  person Markus Olsson    schedule 28.01.2010


Ответы (2)


Хорошо. У меня нет учетной записи в приложениях, поэтому я не могу протестировать вход в систему, но я могу успешно связать домен с приложениями с помощью python-openid 2.2.4. Вот небольшой инструмент отладки для создания запросов на сопоставление: http://gist.github.com/288560

В вашем патче не должно быть исправлений; ассоциированные запросы всегда являются POST-запросами. И библиотека Ruby также всегда отправляет POST, поэтому, если rpxnow не внес каких-либо необычных изменений, rpxnow не должен работать, когда python-openid здесь не работает.

Я собирался спросить вас о openid.store в вашей установке, но если ваш минимальный пример с MemoryStore воспроизводит его, это не так.

Думаю, единственное, что у меня осталось, - это предложить вам обратиться в службу поддержки клиентов Google Apps.

person keturn    schedule 28.01.2010
comment
Это действительно полезно! Что-то изменилось между 2.2.1 и 2.2.4. И мой, и ваш код не работают на чистой 2.2.1, но работают на 2.2.4. Сладкий. Теперь у меня все работает. Добавление поддержки ax в trac-authopenid позволило мне использовать наши официальные адреса электронной почты в качестве имен пользователей trac. Тщательно составленный белый список гарантирует, что только учетные записи компании могут входить в систему, а по умолчанию openid + permredirect заставляет пользователей автоматически входить в систему при посещении сайта. Надо написать об этом в блоге;) Но я отвлекся. Я хотел сказать большое спасибо! - person Markus Olsson; 28.01.2010
comment
Та же проблема исправлена ​​обновлением python-openid до 2.2.5. - person Jj.; 15.12.2010

Вы упомянули, что используете Python 2.6.2 с python-openid. В разделе «Требования» файла README в настоящее время перечислены только Python 2.3, 2.4 или 2.5. Приятно слышать, что у тебя это работает.

person Jacob Wan    schedule 14.11.2010