Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Python zur Implementierung von Anmelde- und Registrierungsfunktionen für Webbenutzer

Verwendung von Python zur Implementierung von Anmelde- und Registrierungsfunktionen für Webbenutzer

不言
不言Original
2018-04-09 17:28:2213500Durchsuche

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() {
 $(&#39;#password&#39;).val(CryptoJS.MD5($(&#39;#password1&#39;).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:

2015430102634859.jpg (560×753)

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(&#39;/api/authenticate&#39;)
def authenticate():
  i = ctx.request.input()
  email = i.email.strip().lower()
  password = i.password
  user = User.find_first(&#39;where email=?&#39;, email)
  if user is None:
    raise APIError(&#39;auth:failed&#39;, &#39;email&#39;, &#39;Invalid email.&#39;)
  elif user.password != password:
    raise APIError(&#39;auth:failed&#39;, &#39;password&#39;, &#39;Invalid password.&#39;)
  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 = &#39;******&#39;
  return user

# 计算加密cookie:
def make_signed_cookie(id, password, max_age):
  expires = str(int(time.time() + max_age))
  L = [id, expires, hashlib.md5(&#39;%s-%s-%s-%s&#39; % (id, password, expires, _COOKIE_KEY)).hexdigest()]
  return &#39;-&#39;.join(L)

对于每个URL处理函数,如果我们都去写解析cookie的代码,那会导致代码重复很多次。

利用拦截器在处理URL之前,把cookie解析出来,并将登录用户绑定到ctx.request对象上,这样,后续的URL处理函数就可以直接拿到登录用户:

@interceptor(&#39;/&#39;)
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(&#39;-&#39;)
    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(&#39;%s-%s-%s-%s&#39; % (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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn