Как проверять, что access токен есть в кэше?
Делаю авторизацию и аутентификацию в приложении. И столкнулся со следующей проблемой, каким образом мне проверять есть ли access токен в кэше? Для чего мне проверять наличие токена в кэше? Это мне требуется для того, чтобы если был логаут или пользователя выкинул администратор, то этот токен с которым пытаются войти был недействителен.
Как я реализовал
При создании токена генерируете уникальный идентификатор токена "jti" (JWT ID). Создаю токен доступа (access token).
В Redis заношу access_token с ключом, основанном на "jti", указав время жизни токена доступа (30 минут).
При получении запроса мне нужно достать токен из кэша, достать его jti, проверить есть ли он кэше, если нет, то вернуть 401 ошибку.
Я думал это как-то можно сделать через атрибуты, но как? Я думал отнаследоваться от атрибута authorize или же сделать фильтр, который чекает токен на наличие в кэше. На данный момент мне видится только одно, запилить собственный атрибут authorize.
Помогите, пожалуйста, буду благодарен за примеры или любые идеи
UPD
Я пытался воспользоваться Events.OnTokenValidated, но есть проблема, которую я не знаю как решить. Я пытаюсь зарезолвить сервис, который будет проверять токен. В общем я написал следующий код:
opt.Events = new JwtBearerEvents
{
OnTokenValidated = async context =>
{
using IServiceScope scope = context.HttpContext.RequestServices.CreateScope();
IAuthService authService = scope.ServiceProvider.GetService<IAuthService>();
string token = await authService.GetAccessTokenAsync();
}
};
Именно в этом методе возникает ошибка, но что за ошибка, я её отловить не могу
public Task<string?> GetAccessTokenAsync()
{
return _httpContextAccessor.HttpContext?.GetTokenAsync("Bearer",
"access_token");
}
Когда я пытаюсь вызвать метод GetAccessTokenAsync() получаю ошибку с чем это может быть связано. IAuthService зарегистрирован через Autofac
internal sealed class ServicesModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<AuthService>()
.As<IAuthService>()
.InstancePerDependency();
}
}
UPD 2
Ошибка возникала в GetTokenAsync(); Я хз с чем это было связано, и там бала ошибка Runtime, сообщение не мог нормально посмотреть, так как она даже не перехватывалась Try Catch. Потом я понял нахрена мне весь токен когда мне нужен только его jti
OnTokenValidated = async context =>
{
using IServiceScope scope = context.HttpContext.RequestServices.CreateScope();
IAuthService authService = scope.ServiceProvider.GetService<IAuthService>();
var accessToken = context.Principal?.Claims.FirstOrDefault(x=> x.Type == "jti")?.Value;
}
Теперь остаётся дело за малым, постучаться в кеш и проверить есть ли такой токен в кэше.