Интеграция приложения с IDENTYX Proxy
Этот раздел описывает, как интегрировать ваше веб-приложение с IDENTYX Proxy для получения информации о пользователях и обработки авторизации.
Обзор интеграции
Когда ваше приложение работает через IDENTYX Proxy, прокси-сервер автоматически обрабатывает аутентификацию пользователей и передает информацию о них в ваше приложение.
Преимущества интеграции:
- Автоматическая аутентификация — не нужно реализовывать собственную систему входа
- Единый вход (SSO) — пользователи входят один раз в IDENTYX и получают доступ ко всем приложениям
- Централизованное управление — все права доступа управляются в IDENTYX
- Безопасность — HTTPS для всех подключений, защищенная передача данных
Способы получения данных о пользователе
Ваше приложение может получить информацию о пользователе тремя способами:
Прокси автоматически добавляет информацию о пользователе в заголовки каждого запроса. Это самый простой способ для приложений, которые не требуют создания сессий.
При создании новой сессии прокси отправляет POST запрос на ваш endpoint с полной информацией о пользователе и токенами доступа. Подходит для приложений с собственной системой сессий.
Приложение может запросить сохраненные учетные записи пользователя для автоматического заполнения форм входа в сторонние системы.
Метод 1: HTTP заголовки (простая интеграция)
Для минимальной интеграции ваше приложение может просто читать HTTP заголовки, которые прокси добавляет к каждому запросу.
Функция передачи данных через HTTP заголовки находится в разработке. Пока рекомендуется использовать метод с REST endpoint.
Метод 2: REST endpoint (рекомендуется)
Это наиболее универсальный способ интеграции, подходящий для приложений с собственной системой управления сессиями.
Настройка endpoint в IDENTYX
Пошаговая инструкция:
- Откройте карточку вашего приложения в IDENTYX
- Перейдите на вкладку Проксирование → подвкладка Перенаправления
- В поле "REST endpoint для информации о новой сессии" укажите URL вашего endpoint (например,
http://localhost:8080/api/identyx/session) - Сохраните настройки приложения
Что прокси отправляет на ваш endpoint
Когда пользователь успешно аутентифицируется, IDENTYX Proxy отправляет POST запрос на указанный endpoint со следующими данными:
| Поле | Тип | Описание |
|---|---|---|
action |
string | Всегда "setOidcUserInfo" |
user_info |
object | Объект с информацией о пользователе |
oidc_access_token |
string | Access токен для обращения к IDENTYX API |
oidc_refresh_token |
string | Refresh токен для обновления access токена |
oidc_session |
string | Идентификатор сессии прокси (GUID) |
Структура объекта user_info
| Поле | Тип | Описание |
|---|---|---|
sub |
string | Уникальный идентификатор пользователя (ID) |
preferred_username |
string | Имя пользователя (username) |
name |
string | Отображаемое имя пользователя |
email |
string | Email пользователя |
permissions |
array | Массив прав доступа пользователя в формате объект:действие |
Примеры реализации endpoint
Пример на PHP:
<?php
// Читаем JSON из тела запроса
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if ($data['action'] === 'setOidcUserInfo') {
$userInfo = $data['user_info'];
$userId = $userInfo['sub'];
$username = $userInfo['preferred_username'];
$displayName = $userInfo['name'];
$email = $userInfo['email'];
$permissions = $userInfo['permissions'];
// Создаем или обновляем сессию пользователя в вашем приложении
session_start();
$_SESSION['identyx_user_id'] = $userId;
$_SESSION['identyx_username'] = $username;
$_SESSION['identyx_display_name'] = $displayName;
$_SESSION['identyx_email'] = $email;
$_SESSION['identyx_permissions'] = $permissions;
$_SESSION['identyx_access_token'] = $data['oidc_access_token'];
$_SESSION['identyx_session'] = $data['oidc_session'];
// Создаем cookie для идентификации сессии приложения
setcookie('app_session_id', session_id(), [
'path' => '/',
'httponly' => true,
'secure' => true,
'samesite' => 'Lax'
]);
// Возвращаем успешный ответ
header('Content-Type: application/json');
echo json_encode(['success' => 'true']);
} else {
http_response_code(400);
echo json_encode(['error' => 'Invalid action']);
}
?>
Пример на Node.js (Express):
const express = require('express');
const session = require('express-session');
const app = express();
app.use(express.json());
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
httpOnly: true,
sameSite: 'lax'
}
}));
app.post('/api/identyx/session', (req, res) => {
const { action, user_info, oidc_access_token, oidc_refresh_token, oidc_session } = req.body;
if (action !== 'setOidcUserInfo') {
return res.status(400).json({ error: 'Invalid action' });
}
// Сохраняем информацию о пользователе в сессию
req.session.identyxUserId = user_info.sub;
req.session.identyxUsername = user_info.preferred_username;
req.session.identyxDisplayName = user_info.name;
req.session.identyxEmail = user_info.email;
req.session.identyxPermissions = user_info.permissions;
req.session.identyxAccessToken = oidc_access_token;
req.session.identyxSessionId = oidc_session;
res.json({ success: 'true' });
});
app.listen(8080);
Пример на Python (Flask):
from flask import Flask, request, session, jsonify
app = Flask(__name__)
app.secret_key = 'your-secret-key'
@app.route('/api/identyx/session', methods=['POST'])
def identyx_session():
data = request.get_json()
if data.get('action') != 'setOidcUserInfo':
return jsonify({'error': 'Invalid action'}), 400
user_info = data.get('user_info', {})
# Сохраняем информацию о пользователе в сессию
session['identyx_user_id'] = user_info.get('sub')
session['identyx_username'] = user_info.get('preferred_username')
session['identyx_display_name'] = user_info.get('name')
session['identyx_email'] = user_info.get('email')
session['identyx_permissions'] = user_info.get('permissions', [])
session['identyx_access_token'] = data.get('oidc_access_token')
session['identyx_session'] = data.get('oidc_session')
return jsonify({'success': 'true'})
if __name__ == '__main__':
app.run(port=8080)
Endpoint должен возвращать JSON ответ {"success": "true"} при успешной обработке. Если прокси не получит этот ответ, пользователь увидит ошибку.
Обработка ошибок авторизации приложения
Иногда сессия прокси может быть валидной, но сессия вашего приложения могла истечь или стать недействительной. В этом случае ваше приложение должно сообщить прокси о необходимости повторной авторизации.
Способы сообщения об ошибке
Ваше приложение может сообщить прокси об ошибке авторизации одним из трех способов:
| Способ | Описание | Применение |
|---|---|---|
| HTTP статус код | Вернуть статус 401 Unauthorized или 403 Forbidden |
Универсальный способ, работает всегда |
| HTTP заголовок | Добавить заголовок X-App-Auth-Error: true |
Для случаев, когда нужен статус 200, но есть ошибка авторизации |
| Cookie | Установить cookie app_auth_error=true |
Для сложных приложений с многоэтапной авторизацией |
Примеры обработки ошибок
Пример на PHP:
<?php
session_start();
// Проверяем сессию приложения
if (!isset($_SESSION['identyx_user_id'])) {
// Сессия истекла - сообщаем прокси
http_response_code(401);
header('X-App-Auth-Error: true');
setcookie('app_auth_error', 'true', 0, '/');
echo 'Сессия истекла';
exit;
}
// Сессия валидна - продолжаем работу
echo 'Добро пожаловать, ' . $_SESSION['identyx_display_name'];
?>
Пример на Node.js (Express):
app.use((req, res, next) => {
// Проверяем сессию приложения
if (!req.session.identyxUserId) {
// Сессия истекла - сообщаем прокси
res.status(401);
res.header('X-App-Auth-Error', 'true');
res.cookie('app_auth_error', 'true', { path: '/' });
return res.send('Сессия истекла');
}
// Сессия валидна - продолжаем
next();
});
Пример на Python (Flask):
from flask import session, make_response
@app.before_request
def check_session():
# Проверяем сессию приложения
if 'identyx_user_id' not in session:
# Сессия истекла - сообщаем прокси
response = make_response('Сессия истекла', 401)
response.headers['X-App-Auth-Error'] = 'true'
response.set_cookie('app_auth_error', 'true', path='/')
return response
Когда прокси обнаруживает ошибку авторизации от приложения, он перенаправляет пользователя на страницу входа IDENTYX. После успешной аутентификации прокси снова отправит данные пользователя на ваш endpoint, и пользователь сможет продолжить работу.
Метод 3: API учетных записей
Если ваше приложение должно автоматически входить в сторонние системы, вы можете получить сохраненные учетные записи пользователя через API прокси.
Получение учетных записей
Endpoint: GET /api/service/proxy/getBestCredentials
Этот endpoint возвращает наиболее подходящие учетные записи пользователя для текущего приложения.
Ответ:
{
"success": true,
"data": {
"credentials": [
{
"object_path": "/myapp",
"credential": {
"id": 123,
"title": "Рабочая учетная запись",
"type": "password",
"source": "personal",
"content": {
"login": "user@example.com",
"password": "secretpassword"
}
}
}
],
"user_id": 456,
"application_id": "myapp-id",
"count": 1
}
}
Пример использования
JavaScript (клиентская сторона):
// Запрашиваем учетные записи
async function getCredentials() {
const response = await fetch('/api/service/proxy/getBestCredentials');
const result = await response.json();
if (result.success && result.data.credentials.length > 0) {
const credential = result.data.credentials[0].credential;
// Автоматически заполняем форму
document.getElementById('username').value = credential.content.login;
document.getElementById('password').value = credential.content.password;
// При необходимости автоматически отправляем форму
document.getElementById('loginForm').submit();
}
}
// Вызываем при загрузке страницы
getCredentials();
Учетные записи могут быть двух типов:
- personal — личные учетные записи пользователя
- group — групповые учетные записи (доступны всем членам группы)
Личные учетные записи имеют приоритет над групповыми.
Жизненный цикл сессии
Понимание жизненного цикла сессии поможет правильно интегрировать приложение с прокси.
- Пользователь обращается к приложению — открывает URL приложения в браузере
- Прокси проверяет сессию — если сессии нет, перенаправляет на страницу входа IDENTYX
- Аутентификация в IDENTYX — пользователь вводит логин и пароль (или использует другие методы входа)
- Прокси получает токены — после успешной аутентификации прокси получает access и refresh токены
- Прокси отправляет данные приложению — POST запрос на ваш endpoint с информацией о пользователе
- Приложение создает сессию — ваше приложение создает свою сессию и возвращает cookie
- Работа с приложением — пользователь получает доступ к приложению
- Обновление токенов — прокси автоматически обновляет токены при истечении
- Завершение сессии — пользователь выходит или сессия истекает по таймауту
Рекомендации по интеграции
Проверяйте сессию приложения на каждый запрос, требующий авторизации. Не полагайтесь только на сессию прокси.
Всегда сообщайте прокси об ошибках авторизации одним из описанных способов, чтобы пользователь мог повторно войти.
Убедитесь, что endpoint для приема данных о сессии доступен по HTTPS или находится на localhost для безопасной передачи токенов.
Храните access и refresh токены в серверной сессии, а не в cookies или localStorage на клиенте.
Решение проблем интеграции
| Проблема | Возможная причина | Решение |
|---|---|---|
| Endpoint не получает данные от прокси | Неправильный URL или приложение недоступно | Проверьте URL endpoint в настройках приложения. Убедитесь, что endpoint доступен с сервера IDENTYX |
| Пользователь видит ошибку после входа | Endpoint не вернул {"success": "true"} |
Убедитесь, что endpoint возвращает корректный JSON ответ |
| Сессия постоянно сбрасывается | Приложение не сохраняет cookie или сессия быстро истекает | Проверьте настройки cookie (secure, httpOnly, sameSite). Увеличьте время жизни сессии |
| Прокси не обнаруживает ошибку авторизации | Приложение не отправляет правильные сигналы | Используйте HTTP статус 401/403 или добавьте заголовок X-App-Auth-Error |
Тестирование интеграции
Для проверки корректности интеграции протестируйте следующие сценарии:
- Первичный вход — пользователь входит в приложение впервые
- Повторный вход — пользователь возвращается в приложение с активной сессией прокси
- Истечение сессии приложения — сессия приложения истекла, но сессия прокси активна
- Истечение сессии прокси — сессия прокси истекла, пользователь должен войти заново
- Принудительный выход — пользователь нажимает кнопку "Выйти"
- Несколько вкладок — пользователь открывает приложение в нескольких вкладках одновременно
После интеграции с прокси изучите раздел API учетных записей для работы с сохраненными учетными записями пользователей.