Сегодня всеми любимый программист нашей фирмы mr.troll совершил титанические усилия и обновил модуль openid авторизации. Вот, только что закончил, так что пробуйте, пробуйте комментировать.
Собственно формочка комментирования под записью появится после авторизации вот по этой ссылке: войти.
Нововведения:
- Поддерживается прямой вход в Гугл (до этого был через сайт-посредник appspot.com)
- Кроме стандартного gmail можно вводить свой домен в google apps. Для этого введите адрес почты целиком, например test@2s.ru
- Возможность войти на сайты с openid 2.0, если указать адрес на XRDS файл.
Я в любом случае вижу ваш комментарий в списке последних комментариев и активирую его если что. Но чтобы не плодить спам я всё таки уберу форму комментария для незалогиненных пользователей.
Теперь небольшие комментарии самого программиста о том что и как делалось:
Вообще в интернете для пхп есть 3 библиотеки для идентификации по Openid. Первая - это SimpleOpenID - один класс без наворотов на 30 килобайт, который поддерживает идентификацию на яндексе, рамблере и жж. На openid2.0 и OAuth он конечно не заходит, так что гугл обламывается.
И вторая распространённая библиотека с OpenidEnabled.com - полумегабайтный архив! Эта библиотека авторизируется почти везде. И везде где можно используется, типа вордпресса и всяких cms. Она также сама сохраняет результаты авторизаций, имеет какие-то свои таблицы в mysql и т.п.
Есть ещё переработанная первая библиотека (Dope Openid) с файлами от второй, где-то на 200 килобайт. У гугла ей удаётся взять информацию только о мыле пользователя.
С "Google apps for your domain" последние две эти библиотеки работают плохо.
Попытался найти крупный сайт (не вордпресс) который бы позволял с ходу залогиниться через openid. Оказалось никто не поддерживает. Если поддерживает, то только через сторонний сайт https://rpxnow.com/ - это единственные люди в мире которые смогли понять документацию гугл. Гугл на них кстати в ней на них ссылается, что-то типа "вот же смогли люди".
Eсть ещё один сайт - форум японских разработчиков. ***и умеют всё. Наверное даже больше чем сами сотрудники гугл. Например чтобы при залогинивании в гугле показать иконку сайта я смог узнать анализируя только их запросы. Больше почти никто не умеет.
Есть комплексные openid consumer'ы в составе фреймворков, например Zend, или на яве или руби, что мне не подходит.
Так как в системе все модули максимально оптимизированы, то я первый вариант open_id consumer'а сделал на базе первой библиотеки. Т.е. 30 килобайт - модуль. Вот Сейчас у меня модуль 46 килобайт - и умеет вообще всё. Включая залогинивание в google apps.
Документация гугла - это просто полный п. Примерно цитирую:
Зайдите на страницу https://www.google.com/accounts/o8/site-xrds?hd=example.com
в ней ничего хорошего нет, зато в хидерах вы найдёте волше-е-ебную сигнатуру:
HTTP/1.1 200 OK
Expires: Fri, 22 May 2009 12:50:18 GMT
...
Signature: gB89TNxvjMbJjLBRjY+ubMHaZ/CODK/l77VGdSTZdgei5k1PxAa/MJ8cP12n5bHwcCVpTNwZjnP3XnjiKNkIDESSzuT7ZyQ2a/tVpge3FgM4R+BgbKfjjayUckVNyC0OYOEeBgq+T27CsBuSEwRpC56A3pcHXC3hfNqxk3zndK0=
Посмотрите на эту волшебную сигнатуру. Правда хорошая? Так вот. Она вам нафиг не нужна. И таких приколов целый вагон. OpenID превратился в ClosedID. Хотя изначальная идея была очень хорошая.
Документацию можете сами вкурить если захотите:
http://groups.google.com/group/google-federated-login-api/web/openid-discovery-for-hosted-domains
Далее. После того как пользователь подтвердил в гугле всё что нужно нужно скриптом проверить от пользователя данные. Гугл берёт и... меняет адрес проверки на что-то типа
http://example.com/openid?id=108441225163454056756
скрипт консумера пытается поконектиться, получает конечно 404 и умирает.
ну... гугл думает, надо бы сам домен уведомить, на всякий случай. А ВДРУГ там есть скрипт который что-нибудь ответит. Причём именно в папке openid.
у домена ещё может быть по мнению гугла ВДРУГ файл http://example.com/.well-known/host-meta
Outsourcing of Signing and host-meta Hosting
Many Google Apps domains don't have the means to sign the site's XRDS document, or even to host the host-meta. Google therefore provides a host-meta for such domains, meaning that the host-meta for example.com might be found in two different places:
(1) http://example.com/.well-known/host-meta
(2) https://www.google.com/accounts/o8/.well-known/host-meta?hd=example.com
RPs who follow the standard discovery flow would just use (1). However an RP can choose to also use (2), for example if they have a login box that explicitly asks users to enter a Google Apps domain name.
Google's endpoint will return a 400 on endpoint (2) if the domain provided is not hosted by Google. So one possible strategy for an RP that wants to cater to Google Apps customers could be to first try endpoint (2), and if that returns a 400, try endpoint (1), and if that doesn't yield anything, give up. Other strategies (fetching both endpoints in parallel, for example), are possible.
The host-meta obtained from endpoint (2) will look like this:
Link: <https://www.google.com/accounts/o8/site-xrds?ns=2&hd=example.com>; rel="describedby http://reltype.google.com/openid/xrd-op"; type="application/xrds+xml"
The site's XRDS hosted at https://www.google.com/accounts/o8/site-xrds?ns=2&hd=example.com will be signed by a certificate issued to hosted-id.google.com, regardless of the domain for which the XRDS applies.
Ну тут уже гугл одумался и говорит "впрочем, файла-то может и не оказаться на сайте пользователя. Ну ничего у нас запасной есть"
И вообще, говорит, лучше сначала скачайте наш запасной файл, а уж если у нас его нет (что ещё хуже) тогда ищите его на сайте example.com
Только прочтя спецификацию раз 10. нашёл некоторые пояснения. например
- it applies the OpenID (http://example.com/openid?id=108441225163454056756) to the template to get the URI of the user's XRDS (in this example, it would be https://www.google.com/accounts/o8/user-xrds?uri=http%3a%2f%2fexample.com%2fopenid%3fid%3d108441225163454056756)
Методом тыка установлено следующее:
Если вдруг, в урле для проверки на валидность будет домен.com/openid?id= нужно заменить это на
www.google.com/accounts/o8/user-xrds?uri=http%3a%2f%2fдомен.com%2fopenid%3fid%3d108441225163454056756
Получить xrds-файл, выцепить оттуда URL и уже туда обратиться за подтверждением.
Надо сказать что поддержка openid для сторонних доменах у гугла появилась только этим летом. Т.е. ни один сайт быстрые ссылки для входа не предоставляет.
Для того чтобы в залогиниться через тот же rpxnow.com нужно выбрать пункт "другой openid" и ввести
https://www.google.com/accounts/o8/site-xrds?hd=yourdomain.ru&
вот только тогда получается, да.
Комментарии:
troll@2s.ru (Alex Troll)
23.11.2009 06:29:52
Sander
23.11.2009 11:53:37
Moony (Елена Лунная)
23.11.2009 23:40:49
zhilinsky@gmail.com (Владимир Жилинский)
24.11.2009 13:37:07
drklord (Dark Lord)
24.11.2009 15:20:20
Moony (Елена Лунная)
24.11.2009 19:55:50
mr.troll
26.01.2010 01:26:54
mr.troll
26.01.2010 01:28:20