Что такое SSO (Single Sign-On)?

«Что такое SSO (Single Sign-On)?» — вопрос из категории C++ Core, который задают на 30% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SSO (Single Sign-On) — это архитектурный подход к аутентификации, позволяющий пользователю один раз войти в систему и получить доступ к нескольким связанным приложениям без повторного ввода учетных данных.

В контексте разработки на C++, интеграция с SSO-провайдером (например, OAuth 2.0 или SAML) обычно происходит на уровне сетевых запросов. Вместо реализации всей логики протокола с нуля, мы используем специализированные библиотеки.

Пример использования библиотеки cpprestsdk (Casablanca) для запроса токена OAuth 2.0:

#include <cpprest/http_client.h>
#include <cpprest/filestream.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

pplx::task<void> request_access_token() {
    http_client client(U("https://sso-provider.com"));
    uri_builder builder(U("/token"));

    // Параметры запроса для grant_type=client_credentials
    http_request request(methods::POST);
    request.set_request_uri(builder.to_string());
    request.headers().set_content_type(U("application/x-www-form-urlencoded"));
    request.set_body(U("grant_type=client_credentials&client_id=my_id&client_secret=my_secret"));

    return client.request(request)
        .then([](http_response response) {
            if(response.status_code() == status_codes::OK) {
                return response.extract_json();
            }
            return pplx::task_from_result(json::value());
        })
        .then([](json::value json_response) {
            if(!json_response.is_null()) {
                utility::string_t access_token = json_response[U("access_token")].as_string();
                // Сохраняем токен для последующих запросов к защищенным API
                std::wcout << L"Access Token: " << access_token << std::endl;
            }
        });
}

Ключевые моменты для C++ разработчика:

  • Библиотеки: Для работы с протоколами SSO используются cpprestsdk, libcurl, Poco Net, или Boost.Beast для низкоуровневых HTTP/2 операций (актуально для gRPC).
  • Безопасность: Критически важно безопасно хранить client_secret, использовать HTTPS и проверять SSL-сертификаты.
  • Кэширование токенов: Полученный access_token и refresh_token нужно безопасно кэшировать (например, с шифрованием) на время их жизни, чтобы избегать лишних сетевых запросов.
  • Интеграция: В клиентских настольных приложениях (Qt, MFC) SSO-поток часто требует встроить WebView для авторизации по коду (Authorization Code Flow с PKCE).