Single Sign On: удобство и безопасность доступа
Single Sign-On (SSO) - это механизм аутентификации, который позволяет пользователям получить доступ к нескольким веб-приложениям, используя только один набор учетных данных. Вместо того, чтобы вводить одни и те же данные для каждого веб-приложения, пользователь может аутентифицироваться только один раз и иметь доступ ко всем приложениям, используя токен или сессию, которые предоставляются единожды.
Пример: Допустим, у нас есть 3 веб-приложения: приложение для управления электронной почтой, служба совместной работы и web-приложение для управления учетными записями. Если бы не было SSO, пользователь должен был бы набирать логин и пароль для каждого приложения. Однако, если мы используем SSO, пользователь может войти в систему один раз и получить доступ ко всем трем приложениям при помощи одного набора учетных данных.
Пример кода:
Как правило, SSO реализуется с помощью протоколов, таких как OpenID, OAuth, SAML и т.д. Ниже пример реализации SSO на базе протокола OpenID Connect.
Сначала необходимо настроить OpenID сервер и регистрировать приложения, которые будут участвовать в SSO.
1. Получить токен OpenID с сервера:
python
import requests
import json
# Адрес сервера авторизации
authorization_server_url = 'https://your_authorization_server.com/auth'
# Идентификатор приложения
client_id = 'your_client_id'
# Секрет приложения
client_secret = 'your_client_secret'
# Адрес приложения
redirect_uri = 'https://your_application.com/callback'
# URL запроса на авторизацию пользователя
authorization_url = '{}/authorize?response_type=code&client_id={}&redirect_uri={}'.format(
authorization_server_url,
client_id,
redirect_uri
)
# Открываем браузер, чтобы пользователь мог войти через свой аккаунт
# и получить одноразовый код авторизации
import webbrowser
webbrowser.open(authorization_url)
# Получаем код авторизации с запросом нашего приложения
authorization_response = input('Введите URL, который вы получили после авторизации: ')
# Используя полученный код идем на сервер за токеном доступа
token_url = '{}/token'.format(authorization_server_url)
token_params = {
'grant_type': 'authorization_code',
'code': authorization_response,
'redirect_uri': redirect_uri,
'client_id': client_id,
'client_secret': client_secret
}
response = requests.post(url=token_url, data=token_params)
tokens = json.loads(response.text)
2. Сохраняем токен у себя на сервере и передаем его другим приложениям:
python
from flask import Flask, request, jsonify
app = Flask(__name__)
# Здесь токен сохраняется, например, в Redis базе данных
tokens = {}
@app.route('/login')
def login():
# Редирект на страницу авторизации с адресом нашего приложения
return redirect(authorization_url)
@app.route('/callback')
def callback():
authorization_response = request.url
# Запрашиваем токен от имени пользователя и сохраняем его у себя на сервере
# Ответ на запрос смотрите выше
tokens['user_id'] = tokens
@app.route('/check')
def check():
# Проверяем, авторизован ли пользователь
user_id = request.headers.get('Authorization')
# Возврщаем информацию о пользователе
return jsonify({'user_id': user_id})
3. На другом приложении получаем токен доступа от сервера авторизации:
python
import requests
import json
# Адрес сервера авторизации
authorization_server_url = 'https://your_authorization_server.com/auth'
# Идентификатор приложения
client_id = 'your_client_id'
# Секрет приложения
client_secret = 'your_client_secret'
# Адрес приложения
redirect_uri = 'https://your_application.com/callback'
# URL запроса на авторизацию пользователя
authorization_url = '{}/authorize?response_type=code&client_id={}&redirect_uri={}'.format(
authorization_server_url,
client_id,
redirect_uri
)
# Здесь запрос от пользователя на получение информации о своем профиле
user_id = 'user_id'
access_token = tokens.get(user_id)
if not access_token:
raise ValueError('User is not authorized')
response = requests.get(
url='https://api.service.com/user',
headers={
'Authorization': access_token,
}
)
user_profile = json.loads(response.text)