Нам необходимо разработать службу единого входа (SSO) для выпуска JWT для большого количества клиентов.Разработчикам этих клиентов также понадобится возможность проверить эти токены.Очевидно, что мы не можем предоставить им наш секретный ключ, который мы использовали для генерации этих токенов.Поэтому вместо этого мы решили предоставить им API-сервис двумя способами.Один для выдачи токена и второй для его проверки.
Я спрашиваю себя, идем ли мы к правильному подходу.Вот базовая схема, которая показывает, как пользователи будут работать со своими клиентами (защищенные приложения)
Пользователь регистрируется со своими учетными данными через наш сервис иполучает свой токен доступа.Затем его токен используется в заголовках запросов защищенного приложения.Клиентский модуль SSO - это AuthenticationHandler, который отправляет HTTP-запросы нашему сервису для проверки действительности токена.
Вот некоторый код из клиентского модуля SSO, который мы используем для проверки токена.Мы используем пользовательский обработчик аутентификации, который выполняет вызовы к удаленной службе единого входа:
internal class SsoAuthenticationHandler : AuthenticationHandler<SsoAuthenticationOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!TryRetrieveToken(Request, out var token))
{
return AuthenticateResult.NoResult();
}
if (await _ssoClient.ValidateTokenAsync(token))
{
return AuthenticateResult.Success(...);
}
return AuthenticateResult.NoResult();
}
}
и SsoClient iself:
public class SsoClient
{
public async Task<bool> ValidateTokenAsync(string token)
{
const string validateUrl = "api/auth/validatetoken";
var address = $"https://{_ssoHost}/{validateUrl}";
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
var res = await httpClient.GetStringAsync(new Uri(address));
reply = DeserializeSsoReply(res);
}
return reply.Succeeded;
}
}
Я не смог найти лучшие практики для нашего сценарияпоэтому мне интересно, есть ли какие-либо возможные подводные камни, с которыми мы можем столкнуться при таком подходе?