Аутентификация и авторизация
Продукты: МоиОтчеты Облако, МоиОтчеты Корпоративный Сервер, МоиОтчеты Публикатор
Процесс проверки подлинности пользовательских данных и выдача пользователю определённых прав в Сервисных решениях осуществляется по одному из двух доступных способов:
Через JWT token.
В этом случае аутентификацию нужно пройти лично, а токен будет действовать только 5 минут, за которые пользователь должен войти в своё приложение. При подключении к серверу браузер перенаправит на сервер аутентификации, после чего сгенерирует токен доступа. С точки зрения безопасности мы ограничиваем возможность получения JWT токена только лично пользователем.
Если в течение 5 минут пользователь не зашёл в приложение, то аутентификацию необходимо пройти заново. Если пользователь зашёл в приложение повторная аутентификация не требуется.
Через API key.
В этом случае процесс получения прав доступа осуществляется для серверных приложений. Для получения ключа доступа (API key) необходимо присутствие пользователя. Однако сам ключ может действовать продолжительное время, например год.
Получение первого API key
Для получения первого API key воспользуйтесь пользовательской панелью. Если по какой-то причине доступа к пользовательской панели нет, можно запросить ключ по описанию ниже.
Самый простой вариант получения ключа - открытие вкладки "Api ключи" и создание его на данной странице.
Вариант 2:
Откройте ссылку в браузере: <{host_name}/account/signin?r={host_name}/api/manage/v1/ApiKeys>.
Переход по этой ссылке направит вас на автоматический процесс аутентификации браузера.
Теперь, когда аутентификация пройдена, необходимо запросить новый ключ.
Нажмите
F12илиCtrl+Shift+I, чтобы открыть панель разработчика. Сочетание клавиш могут отличаться от стандартных, в этом случае откройте панель разработчика через меню браузера.Скопируйте и выполните код в консоли JavaScript.
Этот код сделает
POSTзапрос на URL{host_name}/api/manage/v1/ApiKeysдля создания нового ключа доступа до 2030 года.await fetch('{host_name}/api/manage/v1/ApiKeys', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON. stringify({ "description": "Generated by js develop panel", "expired": "2030-01-01T07:41:23.399Z" }) });Обновите страницу браузера и получите результат.
{ "apiKeys": [ { "value": "cc355oeu1z5d5wncayo33me6c1g5junqdqk4pkupid7t8ynjshey", "description": "Generated by js develop panel", "expired": "2030-01-01T07:41:23.399Z" } ], "count": 1 }
Теперь вы можете использовать API key. В примере выше им является cc355oeu1z5d5wncayo33me6c1g5junqdqk4pkupid7t8ynjshey.
Повторно получать новый API key через браузер нет необходимости.
Как использовать API key
Ключ следует передавать с каждым запросом в заголовке Authorization: Basic. В качестве имени пользователя следует использовать apikey, а в качестве пароля - значение ключа. Например:
Authorization: Basic Base64Encode(apikey:cc355oeu1z5d5wncayo33me6c1g5junqdqk4pkupid7t8ynjshey);
Где Base64Encode это функция кодировки строки в base64.
Для FastReport.Cloud.SDK есть специальный класс, который позволяет добавлять ключ к заголовку запроса FastReportCloudApiKeyHeader.
Для добавления нужного заголовка создайте новый HttpClient.
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri({host_name});
httpClient.DefaultRequestHeaders.Authorization = new FastReportCloudApiKeyHeader(apiKey);
Теперь этот HttpClient можно использовать для всех запросов.
Развёртывание под базовым путём? Если сервер доступен под префиксом (например,
https://company.com/reports), задавайтеBaseAddressс префиксом и завершающим слэшем —new Uri("https://company.com/reports/"). Без завершающего слэша .NET разрешает относительные пути API (api/...) относительно корня хоста и молча отбрасывает префикс/reports, из-за чего каждый запрос возвращает 404. См. раздел 8 в Развёртывание под базовым путём.
Получение нового API key
Для получения нового ключа следует вызвать метод CreateApiKeyAsync(CreateApiKeyVM, CancellationToken)
CreateApiKeyVM model = new CreateApiKeyVM()
{
Description = "Created by FastReport.Cloud.SDK",
Expired = DateTime.UtcNow.AddYears(1)
};
IApiKeysClient apiKeysClient = new ApiKeysClient(httpClient);
await apiKeysClient.CreateApiKeyAsync(model);
По возможности используйте асинхронные аналоги методов вместо синхронных.
В результате выполнения этой функции будет получена модель ApiKeyVM.