Идентификатор OpenID Google различается в зависимости от имени «потребительского» домена. Как избежать проблем, если необходимо изменить доменное имя? - PullRequest
9 голосов
/ 05 апреля 2010

В настоящее время я тестирую реализацию OpenID и замечаю, что Google отправляет другой идентификатор для другого потребляющего имени хоста / имени домена, даже для одного и того же пользователя. Например, Google отправляет другой идентификатор, когда запрашивающий сайт - localhost, по сравнению с идентификатором, который они отправляют, когда запрашивающий сайт - 127.0.0.1 для того же пользователя.

Примечание. На самом деле я не проверял это с использованием имен публичного домена, но не понимаю, почему поведение будет другим.

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

Я также проверял это с MyOpenId, но идентификатор, который создает MyOpenId, исправлен, поэтому с ними проблем не будет.

Ответы [ 3 ]

5 голосов
/ 05 апреля 2010

Посмотрите на Google OpenID наиболее важная техническая проблема Некоторая информация там. В основном ссылка взята из раздела учетных записей stackoverflow.com;)

-sa

3 голосов
/ 30 сентября 2011

Похоже, что URL-адреса OpenID, возвращаемые Google, зависят от используемого значения openid.realm. Кроме того, я только что попробовал процесс OpenID с областью, установленной на http://MYREALM и openid.return_to, установленной на http://localhost/openid.php, но получил HTTP 400 Bad Request. По-видимому, Google проверяет, что область имеет тот же домен (и, вероятно, порт), что и URL-адрес возврата.

Одной из идей для обхода проблемы является сохранение адреса Gmail, связанного с OpenID. Всякий раз, когда вы запрашиваете Google OpenID, всегда запрашивайте адрес электронной почты пользователя через тип атрибута Exchange http://axschema.org/contact/email. Если вы когда-либо меняете домены, вы можете связать новый OpenID URL с их учетной записью на основе адреса электронной почты.

Примечание. обязательно необходимо проверить подпись HMAC-SHA1. В противном случае любой пользователь сможет «вернуться» к действию проверки OpenID вашего веб-приложения с созданным адресом электронной почты, что позволит им захватить чей-либо аккаунт, если он знает адрес Gmail получателя.

Когда пользователь впервые после переключения входит в свою учетную запись Google, процедура миграции:

  1. Отправьте запрос POST на https://www.google.com/accounts/o8/ud со следующими параметрами:

     +---------------------+----------------------------------+
     | openid.ns           | http://specs.openid.net/auth/2.0 |
     | openid.mode         | associate                        |
     | openid.assoc_type   | HMAC-SHA1                        |
     | openid.session_type | no-encryption                    |
     +---------------------+----------------------------------+
     

    (при необходимости заменить openid.realm=http://NEWREALM)

    Ответ будет примерно таким:

     ns:http://specs.openid.net/auth/2.0
     session_type:no-encryption
     assoc_type:HMAC-SHA1
     assoc_handle:B5hJNa39Cl39BXSOKMqkPpk03rJmE0GI6EhHBkvfLOBFAMMQX67HjuFq
     expires_in:46800
     mac_key:F5XUXvoYutLvFv4IzJS0diytLmbe
     
  2. При перенаправлении на служебный URI, https://www.google.com/accounts/o8/ud, режим 'checkid_setup', обязательно отправьте ранее полученный assoc_handle, а также запросите адрес электронной почты пользователя через Attribute Exchange. Другими словами, обязательно отправьте следующие дополнительные параметры:

     +----------------------+----------------------------------------------------------+
     | openid.assoc_handle  | B5hJNa39Cl39BXSOKMqkPpk03rJmE0GI6EhHBkvfLOBFAMMQX67HjuFq |
     | openid.ns.ax         | http://openid.net/srv/ax/1.0                             |
     | openid.ax.mode       | fetch_request                                            |
     | openid.ax.type.email | http://axschema.org/contact/email                        |
     | openid.ax.required   | email                                                    |
     +----------------------+----------------------------------------------------------+
     

    Запрос на возврат будет включать важные параметры openid_signed, openid_sig и openid_ext1_value_email.

  3. Выполните процедуру спецификации подписи OpenID Authentication 2.0 для генерации подписи . Если base64-кодировка подписи HMAC-SHA1 отличается от значения openid_sig, тогда подпись недействительна. Обратите внимание, что ключ MAC в этом примере - F5XUXvoYutLvFv4IzJS0diytLmbe. Используйте любой сервер Google, отправленный обратно с запросом на ассоциацию.

На странице документации Google по федеративному входу в систему указано, что http://axschema.org/contact/email "[r] соответствует адресу электронной почты пользователя". Предположительно, после создания учетной записи Google адрес электронной почты "Gmail" будет зафиксирован. Но если это предположение неверно, то использовать эту процедуру небезопасно, поскольку злонамеренный пользователь может изменить свой адрес электронной почты, возвращенный службой федеративного входа, на любой адрес электронной почты учетной записи, которую он хочет украсть.

Чтобы быть в безопасности, перед активацией нового OpenID отправьте запрос подтверждения по электронной почте на адрес электронной почты. Ссылка для проверки будет содержать одноразовый номер, связанный с новым OpenID. После нажатия на ссылку новый OpenID будет полностью связан с учетной записью пользователя, поскольку получение одноразового номера будет проверять связь между адресом электронной почты и новым URL OpenID.

См. Также: openid.sig - Как он генерируется?

1 голос
/ 01 октября 2011

Существует еще один возможный обходной путь. При выполнении запроса на косвенную аутентификацию (перенаправление на URI-адрес службы) отправьте URL-адрес old OpenID в качестве значений параметров openid.claimed_id и openid.identity, даже если область установлена ​​в новой области.

На моей машине разработчика у меня есть домен 'thiscomputer' с псевдонимом 127.0.0.1. Когда я запросил аутентификацию у провайдера OpenID от Google, области 'http://thiscomputer' и openid.identity и openid.claimed_id, настроенные на http://specs.openid.net/auth/2.0/identifier_select, я получил что-то вроде:

https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ

Затем я запросил аутентификацию у OP, области 'http://localhost' и openid.identity и openid.claimed_id оба установлены на http://specs.openid.net/auth/2.0/identifier_select. Я получил что-то вроде:

https://www.google.com/accounts/o8/id?id=VGwSBXNwzPQk-puNdfZl4tP-s7JNHPA3WmMHozHJ

Затем я запросил аутентификацию у OP, области 'http://localhost' и openid.identity и openid.claimed_id оба установлены на https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ (идентификатор OpenID для моей учетной записи Google, когда область' 1025 *, я получил:

https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ

То есть я получил тот же URL-адрес идентификации OpenID, что и для realm 'http://thiscomputer'. Таким образом, хотя я и "перенес" свое веб-приложение, использующее OpenID, с' thiscomputer 'на' localhost ', я все еще могу использовать старый идентификационный URL OpenID.

Это решение работает до тех пор, пока вам известен старый идентификационный URL-адрес OpenID пользователя, возможно, из-за того, что он хранится в файле cookie.

Одно примечание: я пытался установить openid.identity и openid.claimed_id на разные значения (например, одно http://specs.openid.net/auth/2.0/identifier_select, а другое https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ или одно https://www.google.com/accounts/o8/id?id=VGwSBXN7Q00X4G9CTAsLPMJ3m6JaPljpkrURAUZJ, а другое https://www.google.com/accounts/o8/id?id=VGwSBXNwzPQk-puNdfZl4tP-s7JNHPA3WmMHozHJ), но Google Служба OP ответила: «Запрошенная вами страница недействительна».

...