Разработка скрипта Reverse Proxy - Avanpost FAM/MFA+

Общие сведения

Reverse Proxy – технология подключения веб-приложений к механизмам SSO и MFA, предоставляемым Avanpost FAM. Данный механизм предназначен для использования в ситуациях, когда требуется подключить к системе единой аутентификации унаследованное веб-приложение без поддержки стандартных протоколов OpenID Connect/OAuth, SAML либо RADIUS. 

В режиме Reverse Proxy система SSO выступает в роли посредника (прокси-сервера), с которым взаимодействует пользователь, и который решает за пользователя задачу аутентификации и взаимодействия с веб-сервером непосредственно приложения.

Имеются следующие способы аутентификации, выполняемой сервером Avanpost FAM за пользователя:

  • Без аутентификации – в этом случае система работает как обычный прокси-сервер, проксируя запросы пользователя на сервер без изменений. Дополнительных настроек не предполагается.
  • Базовый – используется механизм HTTP Basic аутентификации согласно RFC 7617. Дополнительных настроек не предполагается.
  • Пользовательский скрипт – используется механизм аутентификации с использованием JavaScript-сценария аутентификации.
  • Форма – используется механизм аутентификации посредством эмуляции отправки HTTP Web Form.

Структура скрипта аутентификации

Для работы с использованием данного механизма требуется разработать и отладить скрипт аутентификации на языке JavaScript. Для разработки данного скрипта желательно обладать базовыми навыками программирования.

В окружении скрипта присутствуют следующие JavaScript-объекты:

ОбъектМетод/свойствоПример вызоваНазначение
context

GetCredentials()
credentials = context.GetCredentials();
Вернуть объект credentials
Send()
var response = context.Send({ 
	url: "https://map.demo.avanpost.ru/api/auth", 
	method: 'GET', 
	headers: { 
		Accept: ['application/json; text/html'], 
	} 
})
Отправить синхронный HTTP-запрос и вернуть результат
SetCookies()
context.SetCookies([
    {
        "Name": "refresh_token",
        "Value": "Value"
    },
)
Установить коллекцию Cookies
credentialsUsernameЛюбая строковая операцияСвойство, содержащее имя учётной записи пользователя в приложении
PasswordЛюбая строковая операцияСвойство, содержащее пароль учётной записи пользователя в приложении

Пример скрипта аутентификации, выполняющего запрос на аутентификацию и подстановку данных в хранилище Cookies:

credentials = context.GetCredentials();
var loginUrl = 'https://map.demo.avanpost.ru/api/auth' + '?' + 'username=' + credentials.Username + '&password=' + encodeURIComponent(credentials.Password);
var response = context.Send(
    {
        url: loginUrl,
        method: 'GET',
        headers: {
            Accept: ['application/json; text/html'],
        }
    })

var jsonObject = JSON.parse(response.body);

context.SetCookies(response.cookies);
context.SetCookies([
    {
        "Name": "refresh_token",
        "Value": jsonObject.refresh_token
    },
    {
        "Name": "access_token",
        "Value": jsonObject.access_token
    }
]);

Обсуждение