Einführung in die JWT-Verifizierung mit Nginx und Lua

Einführung in die JWT-Verifizierung mit Nginx und Lua

Vorwort

Da es keine Abhängigkeiten von Datenbanken und anderen Ressourcen beinhaltet, ist jwt selbst auch zustandslos. Daher basiert der Authentifizierungsdienst nicht mehr auf Java oder anderen Sprachen. Stattdessen verwenden wir das Lua-Skript, um nginx zu verbessern: Wir verwenden das Lua-Skript, um zu überprüfen, ob das Token gültig ist. Wenn es ungültig ist, geben wir direkt 401 zurück. Wenn es gültig ist, leiten wir es so weiter.

Lua-Skript

Hier bin ich auf eine große Grube mit dem Geheimnis gestoßen. Zuerst habe ich den Schlüssel direkt aus dem Java-Backend-Projekt kopiert, aber es kam immer wieder zu signature mismatch: Später stellte ich fest, dass die Backend-Anwendung base64decode-bezogene Methoden verwendete. Ich habe dem Lua-Skript ngx.decode_base64(secret) hinzugefügt, um das Geheimnis zu verarbeiten und das Problem zu lösen. Tatsächlich ist das Problem noch nicht gelöst. Beim Debuggen des Backend-Codes wurde festgestellt, dass das Ergebnis des dekodierten Backend-Schlüssels eine Zeichenfolge war. Um das Problem der verstümmelten Zeichen zu vermeiden, wurde das Geheimnis über https://www.base64encode.org/ neu generiert, wodurch das Problem schließlich gelöst wurde.
Wenn dieser Fehler signature mismatch: auch bei Ihnen in Ihrem Projekt auftritt, müssen Sie prüfen, ob das Backend beim Generieren des Tokens das Geheimnis dekodiert oder anderweitig verarbeitet, und eine entsprechende Verarbeitung im Lua-Skript durchführen.

Bildbeschreibung hier einfügen

nignx.conf-Konfiguration

--nginx-jwt.lua


lokales cjson = erfordert "cjson"
lokales jwt = erfordert „resty.jwt“

--dein Geheimnis
lokales Geheimnis = "IhrGeheimnis dort"
--Keine Authentifizierung erforderlich. API-Liste lokal no_need_token_api_list = {'/api/register', '/api/login'}

lokale Funktion ignore_url (val)
    für Index, Wert in ipairs(no_need_token_api_list)
        wenn (Wert == Wert) dann
            returniere wahr
        Ende
    Ende

    return false
Ende

lokales M = {}


Funktion M.auth()

    wenn ignore_url(ngx.var.request_uri) dann
        zurückkehren
    anders
    Ende
	
    -- Autorisierungsanforderungsheader erforderlich
    lokaler Auth-Header = ngx.var.http_Authorization

    wenn auth_header == nil dann
        ngx.log(ngx.WARN, „Kein Autorisierungsheader“)
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    Ende

    --require Bearer-Token (Bearer-Token erforderlich)
    lokales _, _, Token = Zeichenfolge.find(auth_header, "Bearer%s+(.+)")

    wenn Token == Null dann
        ngx.log(ngx.ERR, "Token fehlt")
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    Ende

    --decode_base64 ist konsistent mit dem lokalen Backend jwt_obj = jwt:verify(ngx.decode_base64(secret), token)

    wenn jwt_obj.verified == false dann
        ngx.log(ngx.ERR, "Ungültiges Token: ".. jwt_obj.reason)
        ngx.status = ngx.HTTP_UNAUTHORIZED
        ngx.say(cjson.encode(jwt_obj))
        ngx.header.content_type = "Anwendung/json; Zeichensatz=utf-8"
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    Ende

Ende

Rückkehr M

Dockerfile-Konfiguration

Arbeiterprozesse 1;

Veranstaltungen
{
  Arbeiterverbindungen 1024;
}
http
{

  lua_package_path "/opt/lua-resty-jwt/lib/?.lua;;";

  Upstream-Backend
  {
    Server 192.168.1.1:8080;
  }
  
  Zugriffsprotokoll /logs/nginx_access.log;
  Fehlerprotokoll /logs/nginx_error.log;

  Server
  {

    hören Sie 80;

    #Backend-API-Schnittstellen-Proxy-Speicherort /api/
    {
      Zugriff über Lua-Block
      {
        lokales Objekt = erforderlich('nginx-jwt')
        obj.auth()
      }
      Proxy-Passwort http://backend;
      Proxy_Redirect aus;
      Proxy_Set_Header Host $host;
      Proxy_Set_Header X-Real-IP $Remote_Addr;
      proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
    }
  }

}

Dies ist das Ende dieses Artikels über die Verwendung von Nginx und Lua zur JWT-Verifizierung. Weitere Informationen zu Nginx und Lua zur JWT-Verifizierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • In Golang greift das Gin-Framework auf JWT zu und verwendet Token zur Identitätsüberprüfung
  • Go Gin+Token (JWT)-Verifizierung zur Erlangung einer Anmeldeverifizierung
  • Golang-Webentwicklung basierend auf dem Gin-Authentifizierungstool JWT
  • Definition, Anforderungen und Analyse der Verwendung von JWT im Gin-Framework

<<:  Aggregatabfrage- und Union-Abfragevorgänge für MySQL-Datenbanken

>>:  Beispielcode für HTML-Formularkomponente

Artikel empfehlen

So erstellen, speichern und laden Sie Docker-Images

Es gibt drei Möglichkeiten, ein Image zu erstelle...

Der Unterschied zwischen z-index: 0 und z-index: auto in CSS

Ich habe vor Kurzem etwas über Stapelkontexte gel...

Grafische Schritte zur Zabbix-Überwachung des VMware Exsi-Hosts

1. Rufen Sie das Virtualisierungscenter auf, meld...

Analyse des Prinzips des Rabbitmq Heartbea-Herzschlagerkennungsmechanismus

Vorwort Wenn Sie RabbitMQ verwenden und für einen...

Verwenden Sie Standard-DL-, DT- und DD-Tags, um Tabellenlisten zu verwerfen

Heutzutage beginnen immer mehr Front-End-Entwickle...

So erhöhen Sie die Ladegeschwindigkeit von HTML-Seiten

(1) Reduzieren Sie HTTP-Anfragen. (Ressourcendate...

So installieren Sie MySQL 5.7 manuell auf CentOS 7.4

MySQL-Datenbanken werden häufig verwendet, insbes...

Tutorial zur Konfiguration des Nginx/Httpd-Reverseproxys für Tomcat

Im vorherigen Blog erfuhren wir die Verwendung un...

MySQL wählt den passenden Datentyp für die ID

Inhaltsverzeichnis Zusammenfassung der Distribute...

Detaillierte Erklärung der MySQL-Syntax, Sonderzeichen und regulären Ausdrücke

Häufig verwendete Anzeigebefehle für MySQL 1. Zei...

So beheben Sie den Fehler "ERROR 1045 (28000)" beim Anmelden bei MySQL

Heute habe ich mich beim Server angemeldet und mi...

Detaillierte Erklärung verschiedener Bildformate wie JPG, GIF und PNG

Jeder weiß, dass Bilder auf Webseiten im Allgemein...