2014-12-10 2 views
0

Я пытаюсь использовать oic библиотеку для аутентификации с Google OpenID Connect, и получите ошибкуGoogle OpenID Connect соответствие

oic.exception.IssuerMismatch: 'https://accounts.google.com' != 'accounts.google.com' 

при запуске

from oic.oic.consumer import Consumer 
db={} 
config={} 
c=Consumer(db, config) 
print c.provider_config('https://accounts.google.com') 

Он пытается доступа https://accounts.google.com/.well-known/openid-configuration, который говорит

"issuer": "accounts.google.com", 

Теперь, specification см. мс предположить, что это неверно:

эмитент: НЕОБХОДИМ. URL с использованием схемы HTTPS, без запроса или фрагмента компонента

Могу ли я правильно интерпретировать ситуацию, что это ошибка в конфигурации подключения OpenID Google? Где я должен сообщить об этой ошибке?

(Примечание: Я не ищет работу, которая была бы достаточно простой: я могу просто пропустить обнаружение конфигурации поставщика и получить жесткий код обнаруженной информации. Но я хочу поддерживать произвольные поставщики OpenID Connect , а не только Google)

+0

Я бы не стал называть это * error * так же, как процесс, который не соответствует 100% спецификации, в то время как 'oic' более точно подтверждает это поле. Документация Google явно заявляет, что HTTPS-запросы должны быть использованы и что HTTP-соединения заблокированы, что * может быть *, поэтому они могут быть не связаны с добавлением этой части URI к 'эмитенту'. – admdrew

+0

Проблема в том, что oic отказывается продолжать. Он пытается проверить, что служба, с которой он контактирует, фактически является тем, к которому приложение пыталось подключиться, и обнаруживает, что это разные службы (на уровне сравнения строк). С точки зрения безопасности это звучит разумно, поскольку вы не хотите отправлять пользователя в неправильную службу. Либо полагающаяся сторона должна сделать эту проверку (в этом случае это ошибка Google для ее отказа), либо приложения должны игнорировать фактическое значение поля эмитента (в этом случае ошибка oic была бы слишком строгой). –

+0

Согласен, я был педантичен в отношении «ошибки» по сравнению с «из спецификации». Я также заметил, что любой другой пример «хорошо известная/открытая конфигурация», которую я мог найти (eBay, Heroku и другие), * включить * включить 'https: //' в 'эмитент'. Не знаю, как вы сообщили об этом Google. – admdrew

ответ

1

Реализация OpenID Connect от Google действительно не соответствует той части спецификации. Google реализовал протокол OpenID Connect (-like) до того, как спецификация была закончена, и, в то же время, некоторые из их RPs стали зависимыми от этого идентификатора. Модификация этого будет изменением для этих RP, и Google решил не делать этого, по крайней мере на данный момент.

некоторых реализациях OpenID Connect действительно сделать исключение для Google, другие пытаются обобщить эту проблему путем добавления «https: //» префикс любого OP эмитента идентификатор, который не начинается с него, некоторые даже не проверьте его, потому что они не реализуют связанные с Discovery функции. Выберите то, что вам больше нравится.

+0

Любой способ сообщить об этом Google, если они не знают? Или попросить их задокументировать это, если они действительно знают? Или ссылку, где они уже задокументировали ее? –

+0

они знают, но вы можете, вероятно, столкнуться с этим: https://groups.google.com/forum/#!forum/openid-connect-interop –

Смежные вопросы