[Unity (C #), Python] Mémo d'étude de communication API ③ Implémentation de la fonction de connexion simplifiée

Que faire cette fois

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é.

Ce qui a été réellement créé

GetHIKAKIN.gif

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.

ログインイメージ.PNG

É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)

Côté unité

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.

Serveur d'applications local (Flask)

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 **.

Qu'est-ce que DB?

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.

la mise en oeuvre

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

Comment effacer le tableau

Si vous décommentez la partie suivante et la déplacez, elle disparaîtra.

  User.__table__.drop(engine)  #Pour la suppression de table

Faites-vous des amis avec Pylint

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"
    ],

Hashing

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.

ログインイメージ.PNG

Authentification de base et Digest

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.

[Source]: Authentification de base (authentification de base) et authentification Digest, leurs rôles et différences

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."

Lien de référence

[Python ORM] Résumé des requêtes SQL de base avec SQL Alchemy

Recommended Posts

[Unity (C #), Python] Mémo d'étude de communication API ③ Implémentation de la fonction de connexion simplifiée
Implémentation de la fonction de connexion dans Django
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Mémo d'étude Python & Machine Learning ⑤: Classification d'Ayame
Mémo d'étude Python & Machine Learning ②: Introduction de la bibliothèque
Mémo de "Cython-Accélérer Python en fusionnant avec C"
API C en Python 3
Mémo de l'API TensorFlow (Python)
Un mémo que j'ai écrit une fonction de base en Python en utilisant la récurrence
[python] Valeur de l'objet fonction (?)
[Line / Python] Mémo d'implémentation Beacon
[Python] L'origine du nom de la fonction python
Implémentation Python du filtre à particules
Implémentation du tri rapide en Python
Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
Géométrie> Calcul de l'angle horaire de deux vecteurs> Lien: implémentation python / implémentation C