Аутентификация OAuth клиента
ПАК КриптоПро DSS обладает возможностью регистрации конфиденциальных OAuth-клиентов. Под конфиденциальным клиентом понимается аутентифицируемые OAuth клиент, обладающий тем или иным фактором аутентификации. КриптоПро DSS позволяет аутентифицировать OAuth-клиенты следующим образом:
Аутентификация с использованием пароля
Данная схема подразумевает наличие у OAuth-клиента пароля, знанием которого обладают только сервер аутентификации и собственно аутентифицируемый клиент.
Для регистрации конфиденциального клиента с паролем (секретом) необходимо при выполнении командлета Add-DssClient
необходимо указать параметр -GenerateSecret
.
В случае если был зарегистрирован публичный клиент (без секрета), возможно сделать его конфиденциальным. Для этого необходимо выполнить
следующую команду:
Set-DssClient -ClientId <string> -Type Confidential -GenerateSecret
Изменить секрет существующего конфиденциального клиента возможно при помощи следующей команды:
Set-DssClient -ClientId <string> -GenerateSecret
Добавить еще один секрет для существующего конфиденциального клиента (например, другого типа или для другого варианта использования клиента) возможно при помощи следующей команды:
# Секрет типа пароль
Add-DssClientSecret -ClientId <string> -Type SharedSecret
# Секрет типа сертификат
Add-DssClientSecret -ClientId <string> -Type Certificate -Certificate <путь к файлу сертификата>
При формировании запросов к серверу аутентификации клиент может передавать свои аутентификационные данные двумя способами:
- при помощи заголовка
Authentication
HTTP-запроса. - в теле HTTP-запроса;
В первом случае для HTTP-запроса необходимо сформировать заголовок Authentication
следующего вида:
Basic dGVzdENsaWVudDp0ZXN0U2VjcmV0
Идентификатор клиента и секрет преобразовываются следующим образом:
Base64(client_id:secret)
, где Base64() это функция преобразования символьной строки в кодировку Base64.
Пример: для OAuth-клиента с идентификатором testClient
и секретом testSecret
необходимо сделать следующее:
- Объединить идентификатор и секрет в строку с разделителем: testClient:testSecret;
- Преобразовать полученную строку с использованием кодировки Base64: Base64(testClient:testSecret)=dGVzdENsaWVudDp0ZXN0U2VjcmV0;
- Сформировать готовый заголовок:
Authenctication: Basic dGVzdENsaWVudDp0ZXN0U2VjcmV0
.
Во втором случае идентификатор OAuth-клиента и секрет необходимо передавать в теле запроса на аутентификацию.
Для идентификатора OAuth-клиента предназначен параметр client_id
, для секрета - client_secret
соответственно.
Примечание
В соответствии с RFC 6749, передача аутентификационных данных клиента в теле запроса должна использоваться только для клиентов, которые не могут в полной мере воспользоваться схемой аутентификации Basic HTTP. Для клиентов, которые обладают возможностью аутентификации через Basic HTTP СТРОГО НЕ РЕКОМЕНДУЕТСЯ передавать данные в теле запроса. Дополнительно следует отметить, что данные НИКОГДА не должны передаваться в строке запроса и должны влючаться ТОЛЬКО в тело.
Аутентификация с использованием сертификата
ПАК КриптоПро DSS поддерживает возможность аутентификации OAuth-клиента посредством установления двустороннего защищенного соединения между клиентом и сервером аутентификации. В качестве фактора аутентификации выступает клиентский сертификат, который используется OAuth-клиентом для установления защищенного соединения.
ПАК предусматривает отдельную конечную точку oauth/token/cert
для аутентификации OAuth-клиентов по клиентскому сертификату. Конечная точка настроена таким образом, что обязательно требует клиентский сертификат.
Процедура аутентификации выглядит следующим образом:
- OAuth-клиент инициирует запрос на авторизацию на указанную выше конечную точку;
- Между сервером и OAuth-клиентом устанавливается двустороннее защищенное соединение;
- Сервер извлекает
client_id
из тела запроса для идентификации OAuth-клиента; - Затем сервер извлекает клиентский сертификат установленного соединения и убеждается, что найденный на предыдущем этапе OAuth-клиент сдержит среди своих секретов извлеченный сертификат;
- В случае положительного результата сервер осуществляет дальнейшую аутентификацию пользователя на основании информации в теле запроса.
Для того, чтобы зарегистрировать сертификат в качестве клиентского секрета, необходимо воспользоваться командлетом Powershell Add-DssClientSecret
, указав в нем тип секрета Certificate
, а сам сертификат в качестве значения параметра Certificate
.