2016-12-24 5 views
1

Ich muss ein E-Mail-Validierung und Passwort-Reset-System erstellen und dafür brauche ich einen Token-Generator. Zuerst dachte ich, dass diese Token streng eindeutig sein müssen, aber wenn ich nach Hash (Token) UND E-Mail in der Datenbank suche, sehe ich nicht, warum ich nicht einfach eine zufällige Zeichenfolge mit einer ausreichenden Länge ohne uniqid() anhängen sollte (das wäre auch ziemlich offensichtlich).Ist eine Kontoprüfung oder ein Passwort-Reset-Token wirklich einzigartig?

Habe ich Recht mit dieser Annahme?

+3

Ja, sie müssen eindeutig sein und nur einmal verwendet werden. Wenn derselbe Benutzer den gleichen Schlüssel verwendet und versucht, denselben Schlüssel zu verwenden und nicht erlaubt ist/sollte, könnte das ein Problem sein. –

+0

Plus, wenn Sie einen AI/PK-Schlüssel von db verwenden (was Sie sollten), dann macht die Verwendung eines eindeutigen Schlüssels zusammen mit der AI/PK es viel mehr "für den Benutzer" einzigartig. Übrigens, ich kam zu der Frage zurück, um zu sehen, ob es mehr Aktivität gab; Es gab einen weiteren Kommentar, aber er wurde gelöscht. Das einzige, was ich mehr sah, war mein Kommentar. Ich denke, dass das zusammen mit dieser ziemlich viel (sollte) die Frage beantworten. Sie können mich anpingen, wenn Sie wollen, wie ich jetzt die Frage für immer verlassen habe. Genieße dein Weihnachten, * Prost * –

Antwort

1

Nicht wirklich, es muss nur für den Benutzer eindeutig sein.

Sie könnten zum Beispiel als Teil des Passwort-Reset benötigen Sie einen Benutzernamen oder E-Mail-Adresse zur Verfügung gestellt werden. In dieser Hinsicht muss Ihr Zurücksetzungs-Token nur für diesen Benutzer eindeutig sein.

Auch, da Sie kein Token in einer Liste von bekannten guten Token für alle Benutzer ist es viel schneller nachschlagen müssen.

Zum Beispiel, mit einem global eindeutigen Passwort-Reset-Token muss ich entweder einige zusätzliche Details wie Benutzerinformationen verwenden, um dieses Token von anderen zu unterscheiden, oder ich muss alle bekannten Token auf irgendeine Weise durchsuchen.

Mit einem einzigartigen Benutzer/Hash-Code muss ich den Code nur überprüfen, für diesen Benutzer vorgesehen ist gültig. Zum Vergleich: Im Allgemeinen finden Sie eine Array-Suche und sogar eine Hashtabellen-Suche dauert viel länger.

Zum Beispiel, wenn ein Benutzer kein Passwort zurücksetzen ihre internen Benutzer initiiert hatte, wie dies im Vergleich aussehen könnten, wenn sie haben. Beachten Sie in diesem Beispiel erlauben wir nur eine einzige letzte Reset-Anforderung Passwort (nicht mehrfach):

User.getName() = "Bob" 
User.getUserName() = "Bob5412" 

User.resetPasswordRequestedTime() = null 
User.resetPasswordToken() = null 
or 
User.resetPasswordRequestedTime() = 1482628217 
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17" 

Jetzt habe ich nur müssen überprüfen, ob das Token für den angeforderten Benutzer gültig war. Machen Sie sich keine Sorgen mehr um "Weltweit einzigartig".

In meinem Code ich eine Passwort-Reset-Anforderung erfordern kann durch den Benutzer innerhalb von 4 Stunden abgeschlossen sein, so dass, wenn sie Anfrage sind danach kam ich würde nur ihre Anfrage ignorieren, ohne etwas zu überprüfen.

+0

Ja, genau meine Gedanken. Und die Token-Ablauffunktion ist definitiv etwas, das ich implementieren werde, da es eine großartige Möglichkeit ist, den Pool der verfügbaren anfälligen Tokens zu reduzieren. –