Вы включаете электронную почту в свое тело токена;почему бы не включить идентификатор пользователя в качестве заявки (поле)? Когда вы проверите токен, если он успешен, он вернет вам тело, так что вы будете знать, для какого пользователя был создан этот токен, и отклоните его, если это не тот, кто делает запрос.
Комучтобы два человека не использовали один и тот же токен одновременно, вы можете хранить список всех действительных токенов при его создании, а также по истечении срока действия токена или его отзыве (например, когда пользователь выходит из системы или сообщает о мошеннике), если он зашел так далеко) удалите его из списка. Во время проверки, если токена нет в списке, даже не пытайтесь расшифровать его, просто немедленно отклоните его.
Если вы дадите своим токенам прилично небольшие окна истечения срока действия (я полагаю, рекомендуется сделать их последнимине более 1 часа), вам не нужно сильно беспокоиться о таких вещах.
РЕДАКТИРОВАТЬ Чтобы уточнить, у вас никогда не будет способа узнать наверняка, что человек, которыйдал вам знак того, кем они себя называют. Вы знаете только, если ваш сервер создал токен и токен в настоящее время действителен. Если вы действительно хотите предотвратить повторные атаки (то есть убедитесь, что два человека не могут использовать один и тот же токен одновременно), вам нужно будет генерировать новый токен при каждом его использовании. Если вы сохраните этот белый список, который я упоминал выше, эта регенерация гарантирует, что каждый токен станет недействительным, как только он будет использован один раз.
Вы также можете, ДОПОЛНИТЕЛЬНО быть уверенным, включить в тело токена утверждение jti
;это поле предназначено для заполнения случайным уникальным значением каждый раз, когда генерируется токен, так что вы можете отслеживать полученные jti и не допускать, чтобы один и тот же входил более одного раза. Это примерно то же самое, что просто отслеживать токены.