Статьи

Объясненный единый вход (SSO)

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

Единая регистрация (SSO) — это процесс, который позволяет пользователю получить доступ к нескольким службам после прохождения аутентификации пользователя (т.е. входа в систему) только один раз. Это включает проверку подлинности во всех службах, на которые пользователь дал разрешение после входа в основную службу. Среди других преимуществ SSO позволяет избежать монотонной задачи подтверждения личности снова и снова с помощью паролей или других систем аутентификации.

Давайте рассмотрим SSO более подробно, и мы будем использовать очень известный сервис для демонстрации его использования и преимуществ.

Процесс аутентификации

Основной процесс единого входа заключается в следующем:

  • Первым шагом является вход в основной сервис (например, Facebook или Google).
  • Когда вы посещаете новую службу, она перенаправляет вас на исходную (или родительскую) службу, чтобы проверить, вошли ли вы в нее.
  • Возвращается токен OTP (одноразовый пароль).
  • Затем токен OTP проверяется новой службой с родительских серверов, и только после успешной проверки пользователю предоставляется запись.

Хотя создание API для единого входа является утомительной задачей, особенно в области обеспечения безопасности, реализация является относительно более простой задачей!

Хороший пример использования единого входа — в сервисах Google. Для доступа к различным службам, таким как YouTube, Gmail, Google+, Google Analytics и т. Д., Достаточно войти в одну основную учетную запись Google.

SSO для ваших собственных продуктов

Когда вы создаете свой собственный продукт, вам необходимо убедиться, что все его компоненты используют одинаковую аутентификацию. Это легко сделать, когда все ваши сервисы ограничены вашей собственной кодовой базой. Однако с такими популярными сервисами, как система комментирования Disqus и Freshdesk для управления взаимоотношениями с клиентами, лучше использовать их, а не создавать свои собственные с нуля.

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

В идеале вам предоставляется пара ключей — открытых и закрытых. Вы генерируете токен для вошедшего в систему пользователя и отправляете его в службу вместе с вашим открытым ключом для проверки. После проверки пользователь автоматически входит в сервис. Чтобы понять это лучше, давайте использовать реальный пример.

Disqus SSO

Disqus — это популярная служба размещения комментариев для веб-сайтов, которая предоставляет множество функций, таких как интеграция с социальными сетями, инструменты модерации, аналитика и даже возможность экспорта комментариев. Он начинался как стартап YCombinator и превратился в один из самых популярных сайтов в мире!

Поскольку система комментариев Disqus встроена в ваши страницы, важно, чтобы пользователю не нужно было входить во второй раз в Disqus, если он уже вошел на ваш сайт. Disqus имеет API с обширной документацией по интеграции SSO.

Сначала вы создаете ключ с именем remote_auth_s3 Вам предоставляется открытый и закрытый ключи при регистрации единого входа в качестве бесплатного дополнения в Disqus.

Вы передаете информацию о пользователе (идентификатор, имя пользователя и адрес электронной почты) в Disqus для аутентификации как JSON. Вы генерируете сообщение, которое вам нужно использовать при отображении системы Disqus на вашей странице. Чтобы лучше это понять, давайте взглянем на пример, написанный на Python.

Примеры кода на нескольких популярных языках, таких как PHP, Ruby и Python, предоставляются Disqus на Github.

Генерация сообщения

Пример кода Python ( найденный на GitHub для входа пользователя на ваш сайт выглядит следующим образом.

 import base64
import hashlib
import hmac
import simplejson
import time

DISQUS_SECRET_KEY = '123456'
DISQUS_PUBLIC_KEY = 'abcdef'

def get_disqus_sso(user):
    # create a JSON packet of our data attributes
    data = simplejson.dumps({
        'id': user['id'],
        'username': user['username'],
        'email': user['email'],
    })
    # encode the data to base64
    message = base64.b64encode(data)
    # generate a timestamp for signing the message
    timestamp = int(time.time())
    # generate our hmac signature
    sig = hmac.HMAC(DISQUS_SECRET_KEY, '%s %s' % (message, timestamp), hashlib.sha1).hexdigest()

# return a script tag to insert the sso message
    return """<script type="text/javascript">
    var disqus_config = function() {
        this.page.remote_auth_s3 = "%(message)s %(sig)s %(timestamp)s";
        this.page.api_key = "%(pub_key)s";
    }
    </script>""" % dict(
        message=message,
        timestamp=timestamp,
        sig=sig,
        pub_key=DISQUS_PUBLIC_KEY,
    )

Инициализация комментариев Disqus

Затем вы отправляете этот сгенерированный токен вместе с вашим открытым ключом в Disqus в запросе JavaScript. Если аутентификация подтверждена, сгенерированная система комментариев уже вошла в систему. Если у вас есть какие-либо проблемы, вы можете обратиться за помощью в Группу Google DIsqus Developers .

Мы видим реализацию SSO в блоге The Bowl , который представляет собой каталог блогов, разработанных в Python / Django. Если вы вошли на веб-сайт, вы должны войти в систему при отображении системы комментариев Disqus. В этом примере объект personidemailpen_name Сообщение генерируется, как показано ниже.

 sso = get_disqus_sso({ 
    'id': person.id, 
    'email': person.user.email, 
    'username': person.pen_name 
})

На внешнем интерфейсе вы просто печатаете эту переменную, чтобы выполнить скрипт. Для демонстрации в режиме реального времени вы можете посетить этот пост в блоге и посмотреть комментарии внизу. Естественно, вы не будете авторизованы.

Screenshot of Disqus without signing in

Затем войдите в Blog Bowl , посетите тот же пост снова (вам нужно войти, чтобы увидеть эффект). Обратите внимание, что вы вошли в систему комментариев ниже.

Screenshot of Disqus after signing in

Еще одна интересная функция, которую обеспечивает Blog Bowl, — это анонимность при размещении контента (например, в этом посте ). Подумайте о ситуации, когда вы хотите, чтобы пользователь отправлял ответы на комментарии в Disqus как анонимный пользователь (например, в Quora ). Мы пошли простым путем и добавили большое количество к идентификатору. Чтобы связать уникальное электронное письмо для пользователя (чтобы оно не отображалось вместе с другими комментариями пользователя), мы также генерируем уникальное электронное письмо. Это сохраняет ваши анонимные комментарии вместе, но не объединяет их с вашим исходным профилем или анонимными комментариями других пользователей.

Screenshot of Disqus as anonymous user

И вот код:

 sso = get_disqus_sso({ 
    'id': 1000000 + person.id, 
    'email': str(person.id) + '-' + str(post.id) + '[email protected]', 
    'username': 'Anonymous' 
})

Вывод

Хотя процессы единого входа для разных служб немного различаются, основная идея, лежащая в их основе, одна и та же — сгенерировать токен и проверить его! Я надеюсь, что этот пост помог вам понять, как приложения интегрируют SSO, и, возможно, это поможет вам реализовать SSO самостоятельно.

Если у вас есть какие-либо исправления, вопросы или собственный опыт, которым вы можете поделиться с SSO, не стесняйтесь комментировать.