Ao lado de sua
resetkey
coluna coloque um DATETIME
coluna chamada, talvez, expires
. Então, sempre que você inserir uma nova chave de reset, insira também um valor em expire:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Logo antes de ler qualquer chave de reset da tabela, faça o seguinte:
DELETE FROM forgot WHERE expires < NOW()
Então você nunca verá uma chave expirada; eles sempre serão eliminados se expirarem.
Agora, você pode optar por fazer algo procurando uma chave de redefinição fornecida pelo usuário. Se expirou, você pode anunciar ao usuário:"Sua chave de redefinição expirou". Mas isso é uma má ideia ... por questões de segurança, você não deve ajudar os usuários a entender por que um token de segurança como uma chave de redefinição é inválido. Você deve apenas dizer "essa chave de redefinição não está correta".
Isso deixa em aberto a possibilidade de algumas linhas contendo token expirado persistirem na tabela? Sim. Mas não será possível para seu aplicativo realmente lê-los e usá-los se você seguir o procedimento de eliminar os expirados antes de usar qualquer token. Se você tiver um motivo para evitar manter tokens expirados na tabela, mesmo que sejam inúteis, você pode configurar um EVENT ou algum outro tipo de trabalho agendado regularmente para executar o
DELETE
afirmação que mencionei.