# #go #jwt #go-guardian
Вопрос:
Я использую go-guardian со стратегией JWT «базовый носитель» для аутентификации в своем проекте, и это работает очень хорошо. Когда у клиента нет токена, он входит в систему со своими учетными данными и получает JWT, который затем может использовать для дальнейших запросов, подобных этому:
$.ajax({
headers: {
'Authorization': 'Bearer ' token
},
url: '/api/archive',
type: "post",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(searchData),
dataType: 'json',
success: onDataReceived,
error: onError
});
Однако мне интересно, как выполнить активный выход из системы на стороне сервера, например, когда клиент переходит на /auth/logoff
маршрут? Конечно, клиент может просто удалить токен, но тогда сервер все равно примет его. Как я могу активно аннулировать или удалить токен на стороне сервера, чтобы я мог с уверенностью сказать, что клиент должен пройти повторную аутентификацию?
Комментарии:
1. Хм, я и сам недавно думал об этом. Но еще не исследовал. Похоже, в кэше есть метод Delete (), который может помочь: github.com/shaj13/go-guardian/blob/master/auth/cache.go
2. Да, я тоже об этом думал. Я думаю, что, вероятно, должна быть функция для признания пользователя недействительным, возможно, она просто еще не реализована. Я посмотрю на тайник.
Ответ №1:
Вы можете сохранить отдельную таблицу user_session
, в которой сеанс также включает токен пользователя. При попадании в конечную точку вы проверяете подпись маркера, а также наличие этого маркера в базе данных.
Вам также необходимо сохранить маркер при входе пользователей в систему и удалить этот маркер при выходе пользователей из системы.
Причина, по которой вам нужно несколько сеансов для каждого пользователя, заключается в том, что пользователи могут входить с разных устройств, используя несколько токенов. Чтобы выйти из системы пользователя, вы можете удалить этот конкретный сеанс со user_session
всех устройств или выйти из системы со всех устройств, вы можете удалить все сеансы этого пользователя.