In diesem Artikel wird hauptsächlich das Tutorial zur Verwendung von Python zum Implementieren von Anmelde- und Registrierungsfunktionen für Webbenutzer vorgestellt. Freunde, die es benötigen, können darauf verweisen
Benutzerverwaltung ist ein Problem, das die meisten Web-Websites lösen müssen. Die Benutzerverwaltung umfasst die Benutzerregistrierung und -anmeldung.
Die Benutzerregistrierung ist relativ einfach. Wir können die Benutzerregistrierungsfunktion zunächst über die API implementieren:
_RE_MD5 = re.compile(r'^[0-9a-f]{32}$') @api @post('/api/users') def register_user(): i = ctx.request.input(name='', email='', password='') name = i.name.strip() email = i.email.strip().lower() password = i.password if not name: raise APIValueError('name') if not email or not _RE_EMAIL.match(email): raise APIValueError('email') if not password or not _RE_MD5.match(password): raise APIValueError('password') user = User.find_first('where email=?', email) if user: raise APIError('register:failed', 'email', 'Email is already in use.') user = User(name=name, email=email, password=password, image='http://www.gravatar.com/avatar/%s?d=mm&s=120' % hashlib.md5(email).hexdigest()) user.insert() return user
Beachten Sie, dass das Benutzerkennwort lautet Der vom Server übergebene 32-Bit-Hash-String des Kunden wird von MD5 berechnet, sodass der Server das ursprüngliche Passwort des Benutzers nicht kennt.
Als nächstes können Sie eine Registrierungsseite erstellen, Benutzer das Registrierungsformular ausfüllen lassen und dann die Daten an die API des registrierten Benutzers übermitteln:
{% extends '__base__.html' %} {% block title %}注册{% endblock %} {% block beforehead %} <script> function check_form() { $('#password').val(CryptoJS.MD5($('#password1').val()).toString()); return true; } </script> {% endblock %} {% block content %} <p class="uk-width-2-3"> <h1>欢迎注册!</h1> <form id="form-register" class="uk-form uk-form-stacked" onsubmit="return check_form()"> <p class="uk-alert uk-alert-danger uk-hidden"></p> <p class="uk-form-row"> <label class="uk-form-label">名字:</label> <p class="uk-form-controls"> <input name="name" type="text" class="uk-width-1-1"> </p> </p> <p class="uk-form-row"> <label class="uk-form-label">电子邮件:</label> <p class="uk-form-controls"> <input name="email" type="text" class="uk-width-1-1"> </p> </p> <p class="uk-form-row"> <label class="uk-form-label">输入口令:</label> <p class="uk-form-controls"> <input id="password1" type="password" class="uk-width-1-1"> <input id="password" name="password" type="hidden"> </p> </p> <p class="uk-form-row"> <label class="uk-form-label">重复口令:</label> <p class="uk-form-controls"> <input name="password2" type="password" maxlength="50" placeholder="重复口令" class="uk-width-1-1"> </p> </p> <p class="uk-form-row"> <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-user"></i> 注册</button> </p> </form> </p> {% endblock %} Try
Auf diese Weise haben wir die Benutzerregistrierungsfunktion abgeschlossen:
Die Benutzeranmeldung ist komplizierter als die Benutzerregistrierung. Da das HTTP-Protokoll ein zustandsloses Protokoll ist und der Server den Benutzerstatus verfolgen möchte, kann dies nur durch Cookies erreicht werden. Die meisten Web-Frameworks bieten Sitzungsfunktionen zum Kapseln von Cookies, die den Benutzerstatus speichern.
Der Vorteil von Session besteht darin, dass es einfach und benutzerfreundlich ist und Benutzeranmeldeinformationen direkt von Session abgerufen werden können.
Der Nachteil von Session besteht darin, dass der Server eine Zuordnungstabelle im Speicher verwalten muss, um Benutzeranmeldeinformationen zu speichern. Wenn mehr als zwei Server vorhanden sind, muss Session daher nur schwer in einem Cluster verwendet werden zu erweitern.
Wir verwenden die Methode des direkten Lesens von Cookies, um die Benutzeranmeldung zu überprüfen. Jedes Mal, wenn ein Benutzer auf eine URL zugreift, wird das Cookie überprüft. Der Vorteil dieser Methode besteht darin, sicherzustellen, dass der Server jede URL zustandslos verarbeitet Auf mehrere Server erweiterbar.
Da der Server ein Cookie generiert und nach erfolgreicher Anmeldung an den Browser sendet, muss sichergestellt werden, dass dieses Cookie nicht vom Client gefälscht wird.
Der Schlüssel zur Implementierung von Anti-Fälschungs-Cookies liegt in einem Einwegalgorithmus (wie MD5), zum Beispiel:
Wenn der Benutzer das richtige Passwort eingibt und sich erfolgreich anmeldet, wird der Server kann den Benutzer aus der Datenbank-ID abrufen und eine Zeichenfolge wie folgt berechnen:
"Benutzer-ID" + "Ablaufzeit" + MD5("Benutzer-ID" + "Benutzerkennwort" + "Ablaufzeit" + " SecretKey")
Wenn der Browser ein Cookie an den Server sendet, kann der Server folgende Informationen erhalten:
Benutzer-ID
Ablaufzeit
MD5-Wert
Wenn die Ablaufzeit nicht abgelaufen ist, sucht der Server anhand des Benutzers nach dem Benutzerpasswort id und berechnet:
MD5("Benutzer-ID" + "Benutzerpasswort" + "Ablaufzeit" + "SecretKey")
und vergleicht es mit dem MD5 im Browser-Cookie gleich sind, hat sich der Benutzer angemeldet, andernfalls ist das Cookie gefälscht.
Der Schlüssel zu diesem Algorithmus ist, dass MD5 ein Einwegalgorithmus ist, das heißt, MD5 kann aus der Originalzeichenfolge berechnet werden, die Originalzeichenfolge kann jedoch nicht aus MD5 abgeleitet werden.
Die Anmelde-API kann also wie folgt implementiert werden:
@api @post('/api/authenticate') def authenticate(): i = ctx.request.input() email = i.email.strip().lower() password = i.password user = User.find_first('where email=?', email) if user is None: raise APIError('auth:failed', 'email', 'Invalid email.') elif user.password != password: raise APIError('auth:failed', 'password', 'Invalid password.') max_age = 604800 cookie = make_signed_cookie(user.id, user.password, max_age) ctx.response.set_cookie(_COOKIE_NAME, cookie, max_age=max_age) user.password = '******' return user # 计算加密cookie: def make_signed_cookie(id, password, max_age): expires = str(int(time.time() + max_age)) L = [id, expires, hashlib.md5('%s-%s-%s-%s' % (id, password, expires, _COOKIE_KEY)).hexdigest()] return '-'.join(L) 对于每个URL处理函数,如果我们都去写解析cookie的代码,那会导致代码重复很多次。 利用拦截器在处理URL之前,把cookie解析出来,并将登录用户绑定到ctx.request对象上,这样,后续的URL处理函数就可以直接拿到登录用户: @interceptor('/') def user_interceptor(next): user = None cookie = ctx.request.cookies.get(_COOKIE_NAME) if cookie: user = parse_signed_cookie(cookie) ctx.request.user = user return next() # 解密cookie: def parse_signed_cookie(cookie_str): try: L = cookie_str.split('-') if len(L) != 3: return None id, expires, md5 = L if int(expires) < time.time(): return None user = User.get(id) if user is None: return None if md5 != hashlib.md5('%s-%s-%s-%s' % (id, user.password, expires, _COOKIE_KEY)).hexdigest(): return None return user except: return None Try
Auf diese Weise haben wir die Benutzerregistrierungs- und Anmeldefunktionen abgeschlossen .
Verwandte Empfehlungen:
Eine Zusammenfassung verschiedener Möglichkeiten zum Verbinden von Zeichenfolgen in Python
Detaillierte Erläuterung der Sortiermethode in Python
Das obige ist der detaillierte Inhalt vonVerwendung von Python zur Implementierung von Anmelde- und Registrierungsfunktionen für Webbenutzer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!