2010-04-21 2 views
16

Я пытаюсь реализовать вход OpenId для веб-приложения. Всякий раз, когда новый пользователь, который входит в систему через OpenId, я создаю нового пользователя в sustem, а среди данных я храню их URL openid, чтобы в следующий раз они вошли в систему с этим пользователем.Почему изменился идентификатор реализации OpenID Google?

Я проверяю это с моей Gmail OpenID, и проблема заключается в том, что каждый раз, когда я делаю это, Google посылает другой OpenID-URL, то есть https://www.google.com/accounts/o8/id?id=SomethingThatChangesFromTimeToTime

Конечно, я тогда не в состоянии сказать Wheter это новый пользователь или нет. Я немного озадачен: не должен ли идентификатор openid оставаться неизменным?

+4

Попытайтесь использовать больше вопросительных знаков и восклицательных знаков!?!? – fig

+2

Обычно я этого не делаю, но я был очень смущен этим поведением. Я ожидал, что преимущество OpenId состояло в том, чтобы иметь уникальный URL-адрес, чтобы идентифицировать себя, а не полагаться на поставщика, который каждый раз назначает его для вас. – Andrea

+0

даже у меня была такая же проблема, но при дальнейшем ровании я узнал, что домен в моем случае, отправленный для запроса на аутентификацию, является той же строкой, но при этом он дает разные значения в разных браузерах. Я тестировал его в FF и хроме. не знаю, чего я здесь не вижу. – awake416

ответ

19

Идентификатор OpenID Google является более или менее хэшированным представлением нескольких данных, включая хост, из которого пришел запрос (точнее, параметр openid.realm, отправленный поставщику). Поэтому, если ваш хост меняет время от времени (например, изменения порта и ip-адреса), тогда идентификатор также будет меняться время от времени. StackOverflow также использует обходной путь для этой проблемы. Проверьте эти сообщения:

Вот FAQ отрывок из Google:

Q: Спецификация OpenID говорит, что openid.realm является необязательным, и если не предоставляется, Google должен использовать URL-адрес openid.return_to. Будет ли это работать?

A: Он будет работать в том смысле, что протокол завершится успешно. Но если ваш URL-адрес return_to - это что-то вроде www.example.com/authenticate?style=openid-federated_login, вы просите нас предложить пользователям одобрить и доверять конкретный адрес вашего сайта, что не является удобным для пользователя. Кроме того, если вы опустите параметр openid.realm, вы никогда не сможете изменить свой URL-адрес return_to: он также неявно изменяет область и идентификаторы URL ваших пользователей учетной записи Google.

+0

Я просто делаю две аутентификации от одного и того же (локального) хоста, в нескольких секундах от другого. Поэтому я думаю, что ничего не меняется; но я получаю разные тождества (openid.identity). – Andrea

+0

зарегистрируйте связь между вашим приложением и Google. Это подтверждают основные основы. Проверьте, является ли запрос одинаковым для обоих ваших запросов или нет. – SztupY

+0

SztupY: «включая хост, из которого пришел запрос», не совсем верно. Переменная здесь - это параметр openid.realm, который не привязан к тому, откуда пришел запрос, а скорее куда будет отправлен ответ (что может быть совсем другим, но часто это одно и то же). –

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