Stockez le nom d'utilisateur et le mot de passe dans ".htpasswd" et supposez que le mot de passe est déjà chiffré. Cette fois, l'authentification de base sera utilisée lors de l'accès à l'écran de gestion "http: // hogehoge / manage". Pour la description de «@auth_basic (check)», reportez-vous à http://qiita.com/yubessy/items/33789eccb35b659b0b4e. Ce qui est nouveau, c'est le cryptage SAH1.
Ci-dessous, la structure des dossiers
/
├── app
│ └── app.py
├── config
│ └─── .htpasswd
└── views
└── manage.j2
Générez un mot de passe à l'avance et stockez-le dans .htpasswd. Les options de htpasswd sont c: nouvelle création de fichier, s: sha1 (format de cryptage). Le nom d'utilisateur et le mot de passe sont enregistrés dans le format ci-dessus (nom d'utilisateur + ":" + "format crypté" + mot de passe crypté).
$ htpasswd -csb .htpasswd user password
$ cat .htpasswd
user:{SHA}H9WJLeNwKEfNwYPyPeiv9nuZoxk=
En python, ce qui précède est lu à partir du fichier et comparé à la valeur entrée par l'utilisateur, il est donc nécessaire de construire une chaîne de caractères au format ci-dessus avec la valeur entrée par l'utilisateur.
Les informations lues dans le fichier ne correspondaient pas dans la comparaison telles qu'elles étaient, probablement parce qu'il y avait un code de saut de ligne, donc le traitement de découpage est effectué par strip ().
from bottle import route, run, request, auth_basic
import hashlib
import base64
from bottle imp
#Ajouter un chemin de modèle
TEMPLATE_PATH.append("../views")
ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) #Chemin absolu vers le dossier où se trouve ce script
def check(username, password):
#Lecture des paramètres côté serveur
f = open(ROOT_PATH + '/../config/.htpasswd', 'r')
auth_check_word = f.readline() #Données de ligne du fichier 1 renvoyées
f.close()
#Chargement des informations de connexion
hs= hashlib.sha1()
hs.update(password.encode("utf-8"))
login_word = username + ":{SHA}" + str(base64.b64encode(hs.digest()).decode("utf-8"))
return auth_check_word.strip() ==login_word.strip()
@route("/manage")
@auth_basic(check)
def manage():
return template('manage.j2')
Pour être honnête, je ne vérifie pas les meilleures pratiques en matière d'authentification des utilisateurs. Cette fois, nous n'avions besoin que d'un seul écran de gestion pour l'administrateur, nous l'avons donc abordé ci-dessus. Comment les autres le mettent-ils en œuvre? Avez-vous un Active Directory?
Recommended Posts