[Unity (C #), Python] Memo zur API-Kommunikationsstudie ③ Implementierung einer vereinfachten Anmeldefunktion

Was ist diesmal zu tun?

Erstellen Sie eine Funktion zum Registrieren und Anmelden der von der Unity-Seite eingegebenen Informationen. Wie beim letzten Mal werden wir einen Anwendungsserver lokal mit Flask einrichten und verwenden.

[Letztes Mal]: [Unity (C #), Python] API-Kommunikationsstudiennotiz ② Starten Sie den lokalen Server mit Flask

Masakari ist alles in Ordnung, weil es viele unklare Interpretationen gibt. ** Besonders wenn es um Sicherheit geht, ist es peinlich, mich Ingenieur zu nennen ** Selbst wenn Sie es mit einem riesigen Masakari schneiden, werde ich es fest nehmen.

Was wurde eigentlich geschaffen

GetHIKAKIN.gif

Sie können Ihr Konto registrieren, indem Sie Ihre ID und Ihr Passwort eingeben. Es ist möglich, sich tatsächlich auf dem Anmeldebildschirm anzumelden.

Es ist ein Bild von dem, was Sie tun.

ログインイメージ.PNG

Da die Informationen in der Datenbank gespeichert sind, werden die Kontoinformationen auch dann nicht gelöscht, wenn Sie den Editor schließen. (vielleicht)

Einheitsseite

Der von Unity durchgeführte Prozess besteht darin, die eingegebenen Informationen an den lokalen Server zu senden. Zeigen Sie einfach den Text als Antwort an.

Verarbeitung im Zusammenhang mit der Registrierungsschaltfläche


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 zum Verbinden
    private const string RegistrationURL = "http://localhost:5000/registration";

    //Benutzeroberfläche des Spielobjekts>Tasteninspektor> On Click()Methode zum Aufrufen von
    public void Registration()
    {
        StartCoroutine(RegistrationCoroutine(RegistrationURL));
    }

    IEnumerator RegistrationCoroutine(string url)
    {
        //Informationen zu POST
        WWWForm form = new WWWForm();
        form.AddField("user_id", m_idInputField.text, Encoding.UTF8);
        form.AddField("password", m_passInputField.text, Encoding.UTF8);

        //Bereiten Sie die URL per POST vor
        UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
        //Legen Sie den Puffer in UnityWebRequest fest
        webRequest.downloadHandler = new DownloadHandlerBuffer();
        //Stellen Sie eine Verbindung zur URL her und warten Sie, bis die Ergebnisse wieder angezeigt werden
        yield return webRequest.SendWebRequest();

        //Auf Fehler prüfen
        if (webRequest.isNetworkError)
        {
            //Kommunikationsfehler
            Debug.Log(webRequest.error);
            m_logText.text = "Kommunikationsfehler";
        }
        else
        {
            //Erfolgreiche Kommunikation
            Debug.Log("Post"+" : "+webRequest.downloadHandler.text);
            m_logText.text = webRequest.downloadHandler.text;
        }
    }
}

Die folgenden Teile sind für das Senden von Informationen an den lokalen Server verantwortlich. Als Informationen, die von der lokalen Serverseite empfangen werden "Benutzer-ID", "Passwort" usw. werden als Anforderungsinformationen zu "Formular" hinzugefügt.

Informationen, die zum Zeitpunkt der Anfrage gesendet werden müssen


    //Informationen zu POST
    WWWForm form = new WWWForm();
    form.AddField("user_id", m_idInputField.text, Encoding.UTF8);
    form.AddField("password", m_passInputField.text, Encoding.UTF8);

Ich verstehe nicht im Detail, form scheint in der Lage zu sein, zusätzlich zur Art der Anfrage (POST, GET usw.) einige Informationen zu übergeben. WWWForm ist eine reine POST-Klasse.

Lokaler Anwendungsserver (Flask)

Das ist wirklich schwierig, ** Was soll ich überhaupt tun ** Es war eine lange und schwierige Situation.

Zunächst fand ich heraus, dass es notwendig ist, eine DB (Datenbank) zu verwenden, um Kontoinformationen zu registrieren **.

Was ist DB?

Eine Datenbank (englisch: database, DB) ist eine Sammlung von Informationen, die zum einfachen Abrufen und Speichern organisiert sind. Normalerweise bezieht es sich auf das, was von einem Computer realisiert wird, aber manchmal wird ein Adressbuch aus Papier oder dergleichen als Datenbank bezeichnet. In einem Datenbanksystem, das einen Computer verwendet, wird häufig ein Datenbankverwaltungssystem verwendet, bei dem es sich um eine Software zum Verwalten der Datenbank handelt.

[Quelle]: [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3 % 83% BC% E3% 82% B9)

Die Datenbank scheint Software zu sein. Wenn Sie tiefer graben, um zu verstehen, wo sich die Daten befinden und wie sie funktionieren, Ich denke nicht tief nach, weil eine großartige Person sagte, dass ich nicht zurückkommen könnte. [Referenzlink]: Woraus besteht eine Datenbank und wo und wie wird sie gespeichert? ..

Es gibt verschiedene Arten von DBs, und diesmal sieht es aus wie ** RDB (relationale Datenbank) **.

SQLAlchemy

Die Sprache SQL wird verwendet, um die Datenbank tatsächlich zu betreiben, aber eine Bibliothek, die dies in Python tut

[Quelle]: First Flask # 4 ~ Spielen wir mit der Datenbank mit SQLAlchemy ~

Korrekt. Es ist bequem! Dieses Mal werde ich dies verwenden.

Implementierung

Es ist endlich die Implementierung von Flask und 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()


#DB-Einstellungen
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)


#Registrieren Sie ID und Passwort in der DB
@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 "Dieser Benutzername wurde verwendet"
    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() + "Herr\n Vielen Dank für Ihre Registrierung")

#Überprüfen Sie die Datenbank, um festzustellen, ob eine Kombination aus ID und Kennwort angemeldet werden kann
@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 "Die Anmeldung ist abgeschlossen"
        else:
            return "Das Passwort ist anders"
    except:
        return "Registrierungsinformationen sind unterschiedlich"


if __name__ == "__main__":
    app.run(debug=True)
    # User.__table__.drop(engine)  #Zum Löschen von Tabellen

So löschen Sie die Tabelle

Wenn Sie den folgenden Teil auskommentieren und verschieben, verschwindet er.

  User.__table__.drop(engine)  #Zum Löschen von Tabellen

Freunde dich mit Pylint an

Ich schreibe Pyhton in VSC, aber Flask kam mit Pylint nicht klar.

Daher habe ich Setting.json geöffnet und die folgenden Einstellungen hinzugefügt.

"python.linting.pylintArgs": [
        "--load-plugins",
        "pylint_flask"
    ],

Hashing

Dieses Mal wollte ich ** Hashing machen und Sicherheitsmaßnahmen sind perfekt! ** Gegenwärtig wurde nur Teil (2) erstellt, daher halte ich es für völlig bedeutungslos. Es gibt viele Artikel, die besagen, dass die Verwendung von POST nicht ausreicht. Ich frage mich, ob alle Informationen, die ausgetauscht werden sollen, gehasht werden müssen. Wenn Sie mehr über diesen Bereich wissen, lassen Sie es mich bitte wissen.

ログインイメージ.PNG

Basis- und Digest-Authentifizierung

Ich fand es heraus, als ich die Sicherheit untersuchte. Es scheint, dass es verschiedene Arten der Authentifizierung gibt.

Die Digest-Authentifizierung ist der Standardauthentifizierung in Bezug auf die Sicherheit überlegen. Es ist jedoch nicht mit allen Umgebungen kompatibel. Wenn Sie die Umgebung des Benutzers kennen, der die Seite in gewissem Umfang verwendet, und einen kompatiblen Browser verwenden, gibt es kein Problem. Die Digest-Authentifizierung eignet sich jedoch nicht zum Festlegen einer Seite für eine nicht angegebene Anzahl von Benutzern.

Andererseits ist die Standardauthentifizierung in Bezug auf die Sicherheit der Digest-Authentifizierung unterlegen. Es sollte jedoch kein Problem geben, wenn Sie es in einer Umgebung verwenden, in der Sicherheitsmaßnahmen im Voraus ergriffen werden, z. B. SSL oder in einem lokalen Netzwerk. Dies hängt nicht von der Umgebung des Benutzers ab.

Auf diese Weise wird beim Festlegen der Benutzerauthentifizierung auf einer Seite, die von einer nicht angegebenen Anzahl von Benutzern verwendet wird, die Standardauthentifizierung in Kombination mit SSL und die Digestauthentifizierung verwendet, wenn die Verbindungsumgebung, z. B. ein Administrator, abhängig von der Situation angegeben wird. Ist üblich.

[Quelle]: Basisauthentifizierung (Basisauthentifizierung) und Digestauthentifizierung, ihre Rollen und Unterschiede

Entspricht die diesmal implementierte der sogenannten Basisauthentifizierung? Ich bin mir nicht sicher, also würde ich gerne wissen, weil es in Ordnung ist zu sagen: "Du hast es auch nicht geschafft."

Referenzlink

[Python ORM] Zusammenfassung grundlegender SQL-Abfragen mit SQL Alchemy

Recommended Posts

[Unity (C #), Python] Memo zur API-Kommunikationsstudie ③ Implementierung einer vereinfachten Anmeldefunktion
Implementierung der Login-Funktion in Django
Crawlen mit Python und Twitter API 2-Implementierung der Benutzersuchfunktion
Python & Machine Learning Study Memo ⑤: Klassifikation von Ayame
Python & Machine Learning Study Memo Introduction: Einführung in die Bibliothek
Memo von "Cython beschleunigt Python durch Fusion mit C"
C-API in Python 3
TensorFlow API-Memo (Python)
Ein Memo, dass ich eine Grundfunktion in Python mit Wiederholung geschrieben habe
[Python] Wert des Funktionsobjekts (?)
[Line / Python] Beacon-Implementierungsnotiz
[Python] Der Ursprung des Namens der Python-Funktion
Python-Implementierung des Partikelfilters
Implementierung der schnellen Sortierung in Python
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Geometrie> Winkelberechnung zweier Vektoren im Uhrzeigersinn> Link: Python-Implementierung / C-Implementierung