Быстрый старт с openID

    Добрый день, друзья.

    Сегодня я хочу поделиться своим опытом внедрения авторизации по openID на своем книжном сайте «Мои книги». Статья рассчитана на начинающих, поэтому вряд ли заинтересует тех, кто уже знает все нюансы этой технологии. Основная ее цель – ответить на вопрос: «да, это удобно, но как же мне сделать такое в моем проекте?!!»



    Быстрый старт

    Желания ковыряться в больших библиотеках у меня не возникло, так что за основу был взят простой класс Simple OpenID PHP Class.

    Для начала отсюда нам понадобятся всего два скрипта: class.openid.php и openid-example.php. Первый — сам класс для работы с openID, второй — образчик его использования, который дальше можно дорабатывать под свои цели. Приятно, что многое прокомментировано. По идее, при правильных настройках сервера тестовый скрипт должен работать уже через 5 минут. Из которых 4 минуты ушло, как ни странно, на выяснение того, что же такое openID-идентификатор.

    Список openID

    OpenID — замечательная технология. Но скажите — кто придумал, что в роли своего openID пользователь должен указывать что-то вроде
    http://id.rambler.ru/users/{логин}/
    ? Они хотят, чтобы я набирал это, да еще и каждый раз вместо пары логин-пароль?! Извините, мне проще зарегистрироваться как обычно. Это во-первых. Во-вторых, никакого единообразия в записи идентификаторов я не заметил: каждый провайдер придумывает такой вид URL, какой ему заблагорассудится. Посмотрите сами:

    http://openid.yandex.ru/{логин}

    http://openid.mail.ru/mail/{логин}

    http://{логин}.myopenid.com/

    http://{логин}.wordpress.com/

    http://{логин}.blogspot.com/

    http://{логин}.livejournal.com/

    http://www.liveinternet.ru/users/{логин}

    http://id.rambler.ru/users/{логин}/


    В-третьих, почему-то эти адреса никак не фигурируют на страницах openID-провайдеров. Да, все заявляют об их поддержке, но попробуйте, скажем, найти этот URL на странице
    http://openid.mail.ru
    . Вот именно. Мне тоже пришлось на полдня стать Шерлоком Холмсом, прежде чем я составил свой список.

    Удобство или произвольная openID-авторизация

    Из сказанного выше вытекает такой момент: дать пользователю возможность вводить произвольный openID URL, или же ограничить его небольшим списком основных провайдеров? Плюс первого варианта: можно авторизоваться с любого сервера. Минус: вынуждаем пользователя запоминать и вводить этот длинный и непонятный адрес. Плюс второго варианта: удобство ввода (выбираем сервер из списка, вводим только логин). Минус: принудительно ограничиваем пользователя только определенным списком серверов авторизации.

    Как поступить здесь — каждый решает самостоятельно. Я выбрал второй путь. В конце концов, сложно найти обычного пользователя, у которого нет учетки на Яндексе, Рамблере, ЖЖ или Mail.ru (Гугл в этом плане сильно отличился — я честно пытался понять, как у них сделана openID, но так и не осилил. Если кто-то может объяснить — пишите в комментариях). Так что я составил список основных серверов, из которых пользователь выбирает свой ( посмотреть в действии ).

    А дальше?

    Ну что ж, авторизация работает, нас перенаправляет на нужный сервер и обратно, скрипт радостно выдает «VALID». Что делать дальше? Дальше необходима еще одна страница, на которой пользователю будет предложено дозаполнить свой профиль. Допустим, мне от пользователя нужен регион и город проживания. E-mail тоже передают не все провайдеры. В-общем, нужно смотреть по ситуации. После того, как профиль заполнен и создан — авторизуем, и дальше пользователь работает как обычно.

    Подводные камни

    Пока прикручивал openID на своем сайте, пришлось потратить немало нервных клеток. Во-первых, то, что работает на локальном сервере, необязательно будет работать у хостера (даже при наличии curl). Пришлось пробовать другие версии класса (по самой первой ссылке в статье доступны еще два варианта — class.openid.v2.php и class.openid.v3.php).

    Еще одним полезным методом в классе является GetAttribute(), которая позволяет взять параметры профиля с openID-сервера (e-mail, полное имя, пол и т.д. – например, вот так: $openid->GetAttribute('email') ). Правда, во второй и третьей версии класса он куда-то исчез, так что нужно добавить:

    function GetAttribute($val)
    {
    return $_GET[«openid_sreg_».$val];
    }

    В целом, можно считать это джентльменским минимумом, чтобы запустить у себя в проекте авторизацию по openID. Буду признателен за дополнения и замечания.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 61

      0
      тоже как-то ковырял Simple OpenID PHP Class (class.openid.v3.php), самым сложным было прикрутить авторизацию через google аккаунт. в итоге все заработало, но до реального проекта не добралось.
        0
        может поделитесь опытом?
      +2
      Отлично и об отличной технологии!
      Прям захотелось продолжить попытки внедрения, но разъясните пожалуйста, как зарегистрировать пользователя, вернее по каким параметрам его можно идентифицировать?
        0
        Если ходит по openID, тогда уникальным является его идентификатор (URL). Если нужно скомбинировать с традиционной авторизацией (логин-пароль), тогда на этапе создания профиля openID еще предлагать придумать уникальный логин. Зайти под таким логином, естественно, не получится, так как пароль рандомный, и нет возможности сменить.
          +1
          Вот, может быть вы мне объясните. Зачем вообще нужно вводить идентификатор OpenID, если потом тебя всё равно заставляют придумывать идентификатор уже внутри сервиса? Разве это не взаимоисключающие понятия?
            +1
            *не минусовал, но объясню
            Если ресурс, который использует авторизацию по OpenID, является ресурсом, на котором можно общаться, оставлять сообщения и совершать публичные действия — то появляется необходимость как либо визуально идентифицировать пользователя. Конечно можно использовать для этого введенный идентификатор, но пользователь не всегда может желать использовать(или раскрывать) идентификатор OpenID. Причин много, и каждый может придумать их не один десяток — так что это дает пользователю право выбора
              0
              Да, согласен. Внутри сайта все-равно нужен какой-то короткий запоминающийся ник.
                –1
                Заменяя OpenID на свои ники-идентификаторы, мы перестаём использовать его по прямому назначению — идентификации.
                  0
                  авторизация и идентификация не совсем одно и тоже
                    0
                    Вот именно! А OpenID предназначен именно для идентификации!
              +1
              Это не совсем то. Есть некоторые сайты, которые выбора не оставляют, а заставляют придумывать логин и пароль, вытаскивая из OpenID только ник, почтовый адрес и некоторые другие сведения.
            –1
            Ну давайте заюзаем в качестве логина либо сам URL (что пахнет идиотизмом хотя я такое видел), либо попробуем выдрать ник с этого сервиса, очень вероятно что он окажется не уникальным, в этом случае добавим рандомных цифр и дадим пользователю возможность потом из профиля поменять если очень захочется. Я у себя так делал. Хуже всего что не все openid провайдеры (Привет жжшечка) возвращают информацию о пользователе. Поэтому бывает приходится из урла что то выдумывать.
              0
              Не чую в URL идиотизма. Хотя далеко не все из них красивые, это да.
          +1
          вы еще логин {login}.ya.ru забыли
            +8
            не заставляйте юзеров кликать прямо по радио кнопке, сделайте текст с помощью label и чтобы было можно кликать также по картинке.
              –6
              Хотите дам идею на 100 миллионов? :)

              Когда я ввожу Логин и Пароль — автоматически данные отсылаются на Каждый сервер и берется первый валидный! :)
                +3
                Готов поспорить, что почти у каждого провайдера есть пользователи alex, vasya, kostya и т.д. Какой выбирать? ;-)
                  0
                  Угу, вот удивится то пользователем под моим ником зарегистрировавшийся в ЖЖшечке, что с него хотят войти по опен ид.
                  Да и я бы удивился, что после того, как я ввёл имя мне предложили авторизоваться на каком-то левом сервисе.
                  +8
                  stackoverflow.com/users/login

                  мне кажется, это — лучший пример реализации openid-реализации
                    +2
                    может мое когда нибудь пригодится habrahabr.ru/blogs/javascript/77539/
                      –1
                      Не совсем. Они предлагают создать новый аккаунт.

                      Реализация потребителя в ЖЖ мне нравится больше: он тоже создаёт аккаунт, но не задаёт перед этим бессмысленный вопрос.
                        0
                        На всех сервисах, использующих авторизацию через OpenID создается аккаунт.
                          0
                          Ваш комментарий настолько же верен, насколько бесполезен. Я писал о другом.
                            0
                            Судя по рейтингу комментария, никто не понял того, чего ты хотел донести до меня и остальных.
                              0
                              Окей, разверну мысль. Создание аккаунта — почти неизбежность, если сайт хочет отслеживать действия пользователя. На некоторых простых сайтах этого можно избежать.

                              Stack Overflow же при этом ещё и спрашивает, создавать аккаунт или не создавать? Зачем? Неужели я могу ответить отрицательно? Я ведь уже нажал «log in».
                                0
                                Давай смотреть логически.
                                Мы заходим в авторизацию (!), пробуем, он видит что мы с этим идентификатором еще не заходили. Заходили бы — авторизовал бы, не заходили — почему бы не предложить сделать там аккаунт.

                                У меня вот 2 openid, может я зашел не под тем, которым хочу. Или, к примеру, в гугле два аккаунта и я уже в одном авторизовался. На stackoverflow просто на всякий случай показывают от какого идентификатора меня будут регистрировать.

                                По-моему, это — правильный ход.
                                  0
                                  Я понял твою позицию, хоть и не разделяю её. Вводя идентификатор, я обычно задумываюсь о том, что и куда я ввожу, поэтому лишние вопросы меня раздражают.
                                    0
                                    Ну, читать много при этом не нужно, кнопка Confirm большая, спрашивается такое только один раз — чего тут раздражаться-то.
                        0
                        Basecamp (да и остальное от 37signals) тоже неплохо реализовано. IntenseDebate — один из лучших вариантов. Для людей работают.
                          0
                          IntenseDebate ещё хуже — они не используют идентификаторы для идентификации.
                        +2
                        Для яндекса и рамблера логин вводить не обязательно (наверное еще для кого-нибудь). Гляньте habrahabr.ru/blogs/webdev/67774/
                          +2
                          Для гугла, ливжурнал и вордпресса тоже.
                            0
                            Покажите пожалуйста ссылку на пример авторизации с помощью ливжурнал без ввода ника.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            Вот для Гугля УРЛ: https://www.google.com/accounts/o8/id
                              0
                              и еще https://www.google.com/profiles/username
                              ?
                                0
                                самое интересное, что это разные openid-аккаунты
                              +1
                              Посмотрите сами:
                              openid.yandex.ru/{логин}
                              Вы не правы, на Яндексе OpenID выглядет предельно лаконично: http://{логин}.ya.ru/
                                0
                                Так тоже работает.
                                  0
                                  вы не правы, так как если у пользователя нет http://{логин}.ya.ru/ (так тоже может быть), то яндекс его динамит, поэтому приведенный пример вернее.
                                  0
                                  Тоже недавно пришлось реализовать первый раз вход по openID в новом проекте. Так-как использовал Zend Framework, то изначально попытался их классы для входа прикрутить. Но, первым в списке приоритетов был гугл, а со второй версией протокола у Зенда проблемы. В итоге использовал хак и всё заработало.

                                  Однако, дальше понадобилось добавить Яндекс, и с ним Зенд тоже отказался работать. Пришлось искать другую библиотеку, остановился на этой, пока работает со всеми требуемыми провайдерами. Рекомендую
                                    0
                                    Спасибо за ссылку на Dope OpendID. Как раз искал замену Simple OpenID с поддержкой OpenID 2.0
                                    0
                                    Simple OpenID PHP Class тоже пробовал, но что-то в ней не понравилось, не помню уже, что. Его плюс, что он кажется единственный на phpclasses для работы с openID
                                      0
                                      Вроде бы он не поддерживает OpenID 2.0
                                      +4
                                      Как вариант: сделать в вышеозначенном примере просто последний пункт «Другой OpenID» с возможностью ввода собственного OpenID адреса.
                                        0
                                        Черт возьми, хватит уже авторизовывать через username.livejournal.com! У меня юзернейм начинается с двух подчеркиваний, и, насколько понимаю, не воспрнимается ЖЖ в этом формате. Правильно писать так: users.livejournal.com/username.
                                          0
                                          Идентифицировать (не авторизовывать!), конечно, лучше по users.livejournal.com/username, но username.livejournal.com тоже является правильным OpenID, когда нет подчёркиваний.
                                            0
                                            при таком подходе не хочет работать (при username.livejournal.com работает) — подскажите в чем проблема?
                                            на запрос users.livejournal.com/username пишет
                                            Сайт, с которого вы только что пришли, вероятно, хочет проверить идентификацию, которую вы не можете предоставить как username.
                                            +4
                                            Есть отличная привычка — привязывать к checkbox и radio соответствующий label. Вот щелкаю я по «mail.ru» в списке и ничего не происходит. Приходится целиться мышкой в маленькую пимпочку слева. Поправьте, пожалуйста.
                                              0
                                              У вас написано «openID-авторизация». OpenID занимается только идентификацией и не имеет никакого отношения к авторизации, аутентификации и ко многим другим слова на букву «а».
                                                +1
                                                Вы правы по сути — насчет авторизации (разрешать делать что-то — прерогатива приложения), но неправы терминологически — насчет аутентификации: OpenID заведует именно аутентификацией.

                                                Идентификация тут не самый общепринятый термин, первый раз его слышу в таком контексте, кстати.
                                                  0
                                                  Прошу прощения, ошибся. Да, OpenID заведует идентификацией и аутентификацией, а авторизация полностью на плечах потребителя.
                                                0
                                                выбор из списка провайдера немного топорная затея. во первых если назвать поле openid_url то наверняка оно заполнится у юзера из автозаполнения браузера. Далее можно еще по химичить и предложить варианты автозаполнения при помощи js, наверняка уже кто-то и делал.
                                                  0
                                                  Скажу больше.
                                                  Меня удивляет, что пользователя пытаются всунуть в рамки конкретных openID-провайдеров. Сам я пользую chi.mp, где адрес очень прост. Кроме того существует общепринятое поле для логин по openID, которое выглядит так
                                                  stackoverflow.com/users/login
                                                  0
                                                  Кстати, в стандарте OpenID из покон века написана форма представления URL — USERID.openid-provider.org
                                                  Все провайдеры OpenID должны это поддерживать. Правда, никто не запрещает им поддерживать любые другие URL. Так что возможно имеет смысл у пользователя спрашивать только ник и название сайта, а дальше самостоятельно строить URL для авторизации. Собственно, в стандарте именно так и предписывается делать.
                                                  «Если идентификатор представляет собой URL, то первое, что делает зависимая сторона (example.com) — приводит его к нормальному виду, то есть к виду pupkin.openid-provider.org/. В соответствии с OpenID 1.0 зависимая сторона запрашивает веб-страницу по этому адресу и через HTML тег находит URL сервера-провайдера OpenID, например, openid-provider.org/openid-auth.php» Это из русской Вики.
                                                    0
                                                    code.google.com/intl/ru/apis/accounts/docs/OpenID.html
                                                    Вот тут вполне доходчиво написано, как работать с гугловским OpenID. Недавно с этим разбирался — все получилось :)
                                                      0
                                                      Теперь еще осталось кому-нибудь написать статью о том, как поднять свой собственный OpenID сервер.
                                                        0
                                                        Занимаюсь разработкой такого на Си под свою библиотеку https://lowenware.com/webstuff/

                                                        >> произвольная openID-авторизация
                                                        Это в некотором роде уязвимость при наличии своего OpenID сервера. Потому что можно авторизовывать себя где угодно с поддельными данными.

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                      Самое читаемое