Créez une fonction pour enregistrer et connecter les informations saisies du côté Unity. Comme la dernière fois, nous allons configurer et utiliser un serveur d'applications localement avec Flask.
[Dernière fois]: [Unity (C #), Python] Mémo d'étude de communication API ② Lancer le serveur local avec Flask
Masakari est très bien parce qu'il y a beaucoup d'interprétations peu claires. ** Surtout en matière de sécurité, c'est embarrassant de m'appeler ingénieur ** Même si vous le coupez avec un énorme Masakari, il sera fermement accepté.
Vous pouvez enregistrer votre compte en entrant votre identifiant et votre mot de passe. Il est possible de se connecter sur l'écran de connexion.
C'est une image de ce que vous faites.
Étant donné que les informations sont enregistrées dans la base de données, les informations de compte ne seront pas supprimées même si vous fermez l'éditeur. (peut être)
Le processus effectué par Unity consiste à envoyer les informations saisies au serveur local. Affichez simplement le texte en réponse.
Traitement lié au bouton d'enregistrement
using System.Collections;
using UnityEngine.Networking;
using UnityEngine;
using System.Text;
using UnityEngine.UI;
public class RegistraionHTTPPost : MonoBehaviour {
[SerializeField, Header("LogText")]
Text m_logText;
[SerializeField, Header("IDInputField")]
InputField m_idInputField;
[SerializeField, Header("PassInputField")]
InputField m_passInputField;
//URL pour se connecter
private const string RegistrationURL = "http://localhost:5000/registration";
//Interface utilisateur des objets de jeu>Inspecteur de bouton> On Click()Méthode à partir de laquelle appeler
public void Registration()
{
StartCoroutine(RegistrationCoroutine(RegistrationURL));
}
IEnumerator RegistrationCoroutine(string url)
{
//Informations à POST
WWWForm form = new WWWForm();
form.AddField("user_id", m_idInputField.text, Encoding.UTF8);
form.AddField("password", m_passInputField.text, Encoding.UTF8);
//Préparer l'URL par POST
UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
//Définir le tampon dans UnityWebRequest
webRequest.downloadHandler = new DownloadHandlerBuffer();
//Connectez-vous à l'URL et attendez que les résultats reviennent
yield return webRequest.SendWebRequest();
//Vérifier les erreurs
if (webRequest.isNetworkError)
{
//Échec de la communication
Debug.Log(webRequest.error);
m_logText.text = "Erreur de communication";
}
else
{
//Communication réussie
Debug.Log("Post"+" : "+webRequest.downloadHandler.text);
m_logText.text = webRequest.downloadHandler.text;
}
}
}
Les parties suivantes sont responsables de l'envoi des informations au serveur local.
En tant qu'informations reçues par le serveur local
ʻUser_id,
password, etc. sont ajoutés à
form` comme informations de demande.
Informations à envoyer au moment de la demande
//Informations à POST
WWWForm form = new WWWForm();
form.AddField("user_id", m_idInputField.text, Encoding.UTF8);
form.AddField("password", m_passInputField.text, Encoding.UTF8);
Je ne comprends pas en détail,
form
semble pouvoir transmettre certaines informations en plus du type de requête (POST, GET, etc.).
WWWForm
est une classe uniquement POST.
C'est vraiment difficile, ** Que dois-je faire ** en premier lieu? C'était une situation longue et difficile.
Tout d'abord, j'ai découvert qu'il est nécessaire d'utiliser une base de données (base de données) pour enregistrer les informations de compte **.
Une base de données (en anglais: base de données, base de données) est un ensemble d'informations organisé pour faciliter la récupération et le stockage. Il se réfère généralement à quelque chose réalisé par un ordinateur, mais un carnet d'adresses papier ou similaire peut également être appelé une base de données. Dans un système de base de données utilisant un ordinateur, un système de gestion de base de données, qui est un logiciel de gestion de la base de données, est souvent utilisé.
[Source]: [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3 % 83% BC% E3% 82% B9)
La base de données semble être un logiciel. Si vous creusez plus profondément pour bien comprendre où se trouvent les données et comment elles fonctionnent, Je ne réfléchis pas profondément parce qu'une personne formidable a dit que je ne pourrais pas revenir. [Lien de référence]: De quoi est constituée une base de données en premier lieu, et où et comment est-elle stockée? ..
Il existe différents types de bases de données, et celle que j'utilise cette fois-ci est comme ** RDB (base de données relationnelle) **.
SQLAlchemy
Le langage SQL est utilisé pour faire fonctionner réellement la base de données, mais une bibliothèque qui le fait depuis Python
[Source]: First Flask # 4 ~ Jouons avec la base de données avec SQLAlchemy ~
C'est vrai. C'est pratique! Cette fois, je vais l'utiliser.
C'est enfin l'implémentation de Flask et DB.
import hashlib
from flask import *
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
app = Flask(__name__)
engine = create_engine('sqlite:///user.db')
Base = declarative_base()
#Paramètres de base de données
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, unique=True)
user_id = Column(String)
password = Column(String)
Base.metadata.create_all(engine)
SessionMaker = sessionmaker(bind=engine)
session = scoped_session(SessionMaker)
#Enregistrer l'ID et le mot de passe dans la base de données
@app.route("/registration", methods=["POST"])
def registration():
user = request.form["user_id"].strip()
check_users = session.query(User).filter(User.user_id == user).all()
if check_users:
return "Ce nom d'utilisateur a été utilisé"
else:
user = User(user_id=request.form["user_id"], password=str(hashlib.sha256(
request.form["password"].strip().encode("utf-8")).digest()))
session.add(user)
session.commit()
return str(user.user_id.strip() + "m\n Merci de vous être inscrit")
#Vérifiez la base de données pour voir s'il s'agit d'une combinaison d'identifiant et de mot de passe pouvant être connecté
@app.route("/login", methods=["POST"])
def login_check():
user = request.form["user_id"].strip()
check_users = session.query(User).filter(User.user_id == user).all()
try:
for login_user in check_users:
login_user_pass = login_user.password
if login_user_pass == str(hashlib.sha256(
request.form["password"].strip().encode("utf-8")).digest()):
return "La connexion est terminée"
else:
return "Le mot de passe est différent"
except:
return "Les informations d'inscription sont différentes"
if __name__ == "__main__":
app.run(debug=True)
# User.__table__.drop(engine) #Pour la suppression de table
Si vous décommentez la partie suivante et la déplacez, elle disparaîtra.
User.__table__.drop(engine) #Pour la suppression de table
J'écris pyhton dans VSC, mais Flask ne s'entendait pas avec Pylint.
Par conséquent, j'ai ouvert Setting.json et ajouté les paramètres suivants.
"python.linting.pylintArgs": [
"--load-plugins",
"pylint_flask"
],
Cette fois, je voulais faire ** le hachage et les mesures de sécurité sont parfaites! ** À l'heure actuelle, seule la partie (2) a été créée, je pense donc qu'elle n'a aucun sens. De nombreux articles disent que le simple fait d'utiliser POST n'est pas une sécurité suffisante. Je me demande si toutes les informations à échanger doivent être hachées. Si vous en savez plus sur ce domaine, merci de me le faire savoir.
J'ai découvert quand j'enquêtais sur la sécurité. Il semble qu'il existe différents types d'authentification.
L'authentification Digest est supérieure à l'authentification de base en termes de sécurité. Cependant, il n'est pas compatible avec tous les environnements. Si vous connaissez l'environnement de l'utilisateur qui utilise la page dans une certaine mesure et que vous utilisez un navigateur compatible, il n'y a pas de problème. Cependant, l'authentification Digest ne convient pas pour une configuration sur une page pour un nombre non spécifié d'utilisateurs.
En revanche, l'authentification de base est inférieure à l'authentification Digest en termes de sécurité. Cependant, il ne devrait y avoir aucun problème si vous l'utilisez dans un environnement où des mesures de sécurité sont prises à l'avance, comme SSL ou dans un réseau local. Cela ne dépend pas de l'environnement de l'utilisateur.
De cette manière, lors de la définition de l'authentification utilisateur sur une page utilisée par un nombre non spécifié d'utilisateurs, de l'authentification de base combinée à SSL et de l'authentification Digest lorsque l'environnement de connexion tel qu'un administrateur est spécifié, en fonction de la situation. Est commun.
Celle implémentée cette fois correspond-elle à ce que l'on appelle l'authentification de base? Je ne suis pas sûr, alors j'aimerais le savoir car il est normal de dire: "Vous n'avez pas fait non plus."
[Python ORM] Résumé des requêtes SQL de base avec SQL Alchemy
Recommended Posts