Struttura del database e logica per le chiavi di conferma

2

Supponiamo di dover implementare un'applicazione che richiede la conferma via email per i nuovi utenti. Quando un nuovo utente si registra, una e-mail che include una chiave di conferma viene inviata al suo indirizzo e-mail. Quando consuma la chiave, la sua registrazione è completa.

Le chiavi di conferma vengono generate alla registrazione (e associate all'utente / email) e archiviate in una tabella nel database. La domanda è: quando un utente consuma la chiave di conferma, dovrebbe essere cancellata la voce corrispondente nel database (cioè l'assenza di tale voce indica il fatto che l'utente è stato confermato) o dovrebbe esserci una colonna aggiuntiva nella tabella ( es. 'confermato') che indica se l'utente è stato confermato o meno?

    
posta swyrazik 16.02.2017 - 14:32
fonte

2 risposte

1

Non esiste un modo giusto o sbagliato di implementare questo nel database, tutto dipende dalle tue esigenze.

Normalmente, la conferma della registrazione tramite e-mail viene effettuata per convalidare l'indirizzo e-mail dell'utente. Il reparto marketing desidera assicurarsi che quando inviano campagne di marketing, tali campagne raggiungano effettivamente la posta in arrivo di qualcuno :). Altri motivi per convalidare l'e-mail è assicurarsi che se l'utente dimentica la sua password, hai un canale su cui puoi inviare un token di reset.

Se la chiave di registrazione viene utilizzata solo per convalidare l'email dell'utente, non è nemmeno necessario memorizzarla da qualche parte, ma solo generarla dai dati dell'utente:

a = user id in the database;
b = user email;
c = timestamp of registration;
d = number of hours (or days) that the confirmation key is valid;
e = any other unique things of the user

confirmationKey = sha1(concat(a, b, c, d, e))

Invii quindi all'utente questa chiave di conferma nell'e-mail, e quando lui risponde, rigenera l'hash e lo abbina a quello che l'utente ha inviato. Se l'hash corrisponde, verifichi se il tempo in cui l'utente ha confermato la registrazione è inferiore a c + d . Se sì, allora il token è valido e non è ancora scaduto. Ovviamente è necessario assicurarsi che la chiave di conferma non possa essere indovinata da nessuno e campi come c aiuto in tal senso. Hai un'idea ...

Ora non è necessario memorizzare nulla in un database ... a meno che non sia necessario rispondere a domande sulla procedura di registrazione, ad esempio:

  • quanti utenti hanno effettivamente confermato dopo la registrazione? Forse alcuni di quelli che non hanno confermato sono i bot?
  • quanto tempo impiegano solitamente gli utenti per confermare la registrazione?
  • per quanti utenti è stata rilasciata la chiave di conferma prima che confermassero effettivamente?
  • etc

Dopo aver individuato le domande a cui hai bisogno di rispondere (se ce ne sono), saprai anche cosa devi memorizzare nel database e come.

    
risposta data 19.02.2017 - 21:51
fonte
0

Penso che vorrai che la chiave di conferma sia temporanea e che scada dopo un certo tempo se l'utente non si registra. Dovresti avere una tabella separata con chiavi di conferma e un link all'utente corrispondente nella tabella utente. La tabella utente avrebbe un campo che indica lo stato di conferma. Se l'utente si registra correttamente, imposta il flag nella tabella utente ed elimina il record corrispondente nella tabella delle chiavi di conferma. Se la chiave di conferma scade, dovrebbe essere cancellata in quel momento.

    
risposta data 16.02.2017 - 15:19
fonte

Leggi altre domande sui tag