Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Проблема, которую решает OpenID
OpenID решает проблему фрагментированной идентификации в интернете — необходимость иметь отдельные учётные записи и пароли для каждого сайта.
До OpenID: проблема "множество паролей"
Каждый веб-сайт требовал отдельную регистрацию и пароль:
Google.com → Login: user@gmail.com Password: ***
Facebook.com → Login: user@facebook.com Password: ***
Yahoo.com → Login: user@yahoo.com Password: ***
Github.com → Login: user Password: ***
Stackoverflow.com → Login: user Password: ***
Проблемы этого подхода
- Усталость от паролей — пользователь должен помнить дюжины паролей
- Слабые пароли — люди выбирают простые пароли, которые легко взломать
- Переиспользование паролей — если пароль украдут на одном сайте, он скомпрометирован везде
- Сложность восстановления — каждый сайт требует отдельного процесса восстановления пароля
- Высокие затраты — каждому сайту нужна система аутентификации и управления пользователями
Решение OpenID: децентрализованная идентификация
OpenID позволяет пользователю иметь одну цифровую идентификацию, которую он может использовать на множестве сайтов:
Пользователь имеет OpenID-идентификатор: user@openidprovider.com
На любом сайте:
Сайт1.com → "Вы уже зарегистрированы через OpenID? Нажмите сюда"
Сайт2.com → "Логин через OpenID (Google, Yahoo, Facebook)"
Сайт3.com → "Нет пароля? Используйте OpenID"
Как работает OpenID (на примере OpenID 2.0)
Архитектура
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Сайт │ │ Пользователь│ │ OpenID Provider│
│ (Relying │ │ │ │ (Identity │
│ Party) │ │ │ │ Provider) │
└──────┬──────┘ └──────┬───────┘ └────────┬────────┘
│ │ │
│ 1. Нажать │ │
│ "OpenID Login" │ │
├──────────────────────> │
│ │ 2. Редирект на │
│ │ OpenID Provider │
│ |<──────────────────────┤
│ │ │
│ │ 3. Ввести пароль │
│ │ (один раз!) │
│ │ │
│ │ 4. Подтверждение │
│ │ от провайдера │
│ 5. Токен верификации |<─────────────────────┤
│<─────────────────────┤ │
│ │ │
│ 6. Сайт проверяет │ │
│ подпись токена │ │
├─────────────────────────────────────────────>
│ │ │
│ 7. Подтверждение │ │
│ валидности │ │
│<─────────────────────────────────────────────┤
│ │ │
│ 8. Пользователь │ │
│ авторизирован │ │
▼ ▼ ▼
Технический пример с Python
Использование OpenID с Flask
from flask import Flask, session, redirect, url_for
from flask_openid import OpenID
app = Flask(__name__)
app.secret_key = 'secret_key'
oid = OpenID(app)
@app.route('/')
def index():
return '''
<h1>Логин через OpenID</h1>
<form action="%s" method="POST">
<input type="text" name="openid_identifier" placeholder="https://youridentity.openid.com">
<input type="submit" value="Login">
</form>
''' % url_for('login_openid')
@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login_openid():
if oid.try_login():
return redirect(oid.get_next_url())
return redirect(url_for('index'))
@app.after_request
def external_url_handler(self, url):
if oid.response:
# Проверка ответа от OpenID провайдера
if oid.response.status == oid.SUCCESS:
session['user'] = oid.response.getDisplayIdentifier()
return redirect(url_for('dashboard'))
return url
@app.route('/dashboard')
def dashboard():
return f'Добро пожаловать, {session.get("user")}!'
Сравнение с другими подходами
OAuth 2.0 vs OpenID
OpenID (идентификация):
- Кто ты? (аутентификация)
- Протокол для входа
- Передаёт информацию о личности
OAuth 2.0 (авторизация):
- Какие права у тебя? (авторизация)
- Протокол для доступа к ресурсам
- Передаёт токены доступа
# OpenID: я доказываю, кто я
response = openid_provider.verify_identity(user_id)
# OAuth 2.0: я прошу доступ к твоим ресурсам
token = oauth_provider.get_access_token(user_id, scope='email profile')
OpenID Connect (современный стандарт)
Впоследствии создан OpenID Connect — комбинация OpenID + OAuth 2.0:
from authlib.integrations.flask_client import OAuth
oauth = OAuth()
openid = oauth.register(
name='openid',
client_id='YOUR_CLIENT_ID',
client_secret='YOUR_CLIENT_SECRET',
server_metadata_url='https://openid.provider/.well-known/openid-configuration',
client_kwargs={'scope': 'openid email profile'}
)
@app.route('/login')
def login():
return openid.authorize_redirect(redirect_uri=url_for('auth_callback', _external=True))
@app.route('/auth/callback')
def auth_callback():
token = openid.authorize_access_token()
user_info = token['userinfo']
session['user'] = user_info
return redirect(url_for('dashboard'))
История и эволюция
- OpenID 1.0 (2006) — первый стандарт
- OpenID 2.0 (2007) — улучшенная версия
- OpenID Connect (2014) — модернизация поверх OAuth 2.0 (используется сейчас)
Применение в реальности
Сегодня OpenID используется в:
- Google Sign-in
- Facebook Login
- GitHub Authentication
- Microsoft Account (через OpenID Connect)
Вывод
OpenID решает проблему фрагментированной идентификации — позволяет пользователям иметь одну цифровую идентификацию для множества сайтов, вместо того чтобы помнить множество паролей. Это упрощает жизнь пользователям и снижает затраты на разработку систем аутентификации для сайтов.