


Golang-Entwicklung: Implementierung einer JWT-basierten Benutzerauthentifizierung
Golang-Entwicklung: Implementierung einer JWT-basierten Benutzerauthentifizierung
Mit der rasanten Entwicklung des Internets ist die Benutzerauthentifizierung zu einem entscheidenden Bestandteil von Webanwendungen geworden. Die traditionelle Cookie-basierte Authentifizierungsmethode wurde nach und nach durch die JWT-basierte Authentifizierungsmethode (JSON Web Token) ersetzt. JWT ist ein einfacher Authentifizierungsstandard, der es dem Server ermöglicht, ein verschlüsseltes Token zu generieren und das Token an den Client zu senden. Wenn der Client eine Anfrage sendet, fügt er das Token zur Überprüfung in den Autorisierungsheader ein.
In diesem Artikel erfahren Sie, wie Sie mit Golang ein JWT-basiertes Benutzerauthentifizierungssystem entwickeln, um die Sicherheit von Webanwendungen zu schützen. Wir werden Gin als Web-Framework und die jwt-go-Bibliothek von Golang verwenden, um die JWT-Generierung und -Verifizierung zu implementieren.
Zuerst müssen wir die Bibliotheken Gin und jwt-go installieren. Führen Sie den folgenden Befehl im Terminal aus, um die erforderlichen Abhängigkeiten zu installieren:
go get -u github.com/gin-gonic/gin go get -u github.com/dgrijalva/jwt-go
Nachdem die Installation abgeschlossen ist, können wir mit dem Schreiben von Code beginnen. Erstellen Sie zunächst eine main.go
-Datei und importieren Sie die erforderlichen Pakete darin: main.go
文件,并在其中导入所需的包:
package main import ( "fmt" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" "net/http" "time" )
接下来,我们需要定义一个结构体来表示用户信息。在本例中,我们使用一个简单的User
结构体,包含用户ID和用户名:
type User struct { ID int `json:"id"` Username string `json:"username"` }
然后,我们创建一个JWT的密钥,用于对令牌进行加密和解密。可以在代码中定义一个常量,或者将其存储在配置文件中。
const SecretKey = "YourSecretKey"
现在,我们可以编写一个处理用户注册的路由处理函数。在该处理函数中,我们将生成一个JWT并返回给客户端。代码如下:
func signUpHandler(c *gin.Context) { // 获取请求体中的用户名 username := c.PostForm("username") // 创建用户 user := User{ ID: 1, Username: username, } // 生成JWT token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "userId": user.ID, "username": user.Username, "exp": time.Now().Add(time.Hour * 24).Unix(), }) // 使用密钥对JWT进行签名 tokenString, err := token.SignedString([]byte(SecretKey)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } // 返回JWT给客户端 c.JSON(http.StatusOK, gin.H{"token": tokenString}) }
接下来,我们编写一个中间件函数来进行JWT的验证。该中间件函数将会被应用到需要进行身份验证的路由上。
func authMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 从请求头中获取JWT tokenString := c.GetHeader("Authorization") if tokenString == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "未授权"}) c.Abort() return } // 解析JWT token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { // 验证密钥是否一致 if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("无效的签名方法: %v", token.Header["alg"]) } return []byte(SecretKey), nil }) // 验证JWT是否有效 if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()}) c.Abort() return } // 将用户信息存储在上下文中 if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { c.Set("userId", claims["userId"]) c.Set("username", claims["username"]) } else { c.JSON(http.StatusUnauthorized, gin.H{"error": "无效的JWT"}) c.Abort() return } } }
最后,我们定义一个需要进行身份验证的路由,并在路由上应用上述的中间件函数。
func main() { // 创建Gin引擎 router := gin.Default() // 注册用户注册路由 router.POST("/signup", signUpHandler) // 添加身份验证中间件 router.Use(authMiddleware()) // 需要进行身份验证的路由 router.GET("/profile", func(c *gin.Context) { userId := c.MustGet("userId").(float64) username := c.MustGet("username").(string) c.JSON(http.StatusOK, gin.H{"userId": userId, "username": username}) }) // 启动服务器 router.Run(":8080") }
现在我们可以运行该程序,并在浏览器中访问 http://localhost:8080/signup
进行用户注册。注册成功后会返回一个JWT,然后我们可以通过访问 http://localhost:8080/profile
rrreee
User
-Struktur, die die Benutzer-ID und den Benutzernamen enthält: rrreee
Dann erstellen wir einen JWT-Schlüssel, der zum Ver- und Entschlüsseln des Tokens verwendet wird. Sie können eine Konstante im Code definieren oder in einer Konfigurationsdatei speichern. 🎜rrreee🎜Jetzt können wir eine Route-Handler-Funktion schreiben, die die Benutzerregistrierung übernimmt. In dieser Handlerfunktion generieren wir ein JWT und geben es an den Client zurück. Der Code lautet wie folgt: 🎜rrreee🎜Als nächstes schreiben wir eine Middleware-Funktion, um die JWT-Überprüfung durchzuführen. Diese Middleware-Funktion wird auf Routen angewendet, die eine Authentifizierung erfordern. 🎜rrreee🎜Abschließend definieren wir eine Route, die eine Authentifizierung erfordert, und wenden die oben genannte Middleware-Funktion auf die Route an. 🎜rrreee🎜Jetzt können wir das Programm ausführen und zur Benutzerregistrierung im Browser aufhttp://localhost:8080/signup
zugreifen. Nach erfolgreicher Registrierung wird ein JWT zurückgegeben, und dann können wir Benutzerinformationen anzeigen, indem wir auf http://localhost:8080/profile
zugreifen. 🎜🎜Das Obige ist der Beispielcode für die Verwendung von Golang zur Implementierung der JWT-basierten Benutzerauthentifizierung. Durch den Einsatz von JWT können wir eine einfache und sichere Benutzerauthentifizierung implementieren und die Sicherheit von Webanwendungen schützen. Natürlich müssen in der tatsächlichen Entwicklung weitere Sicherheits- und Fehlerbehandlungsmechanismen sowie Front-End-Zugriffs- und Benutzeranmeldungsorganisationsfunktionen berücksichtigt werden. Ich hoffe, dieser Artikel ist hilfreich für Sie! 🎜Das obige ist der detaillierte Inhalt vonGolang-Entwicklung: Implementierung einer JWT-basierten Benutzerauthentifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

ToInteGrategolangServicesWithExistingPythoninFrastructure, benutzerdepisorgrpcforinter-serviceCommunication, erlaubtgoandhonAppStoInteractSeamlos-ThroughStandardizedProtocols.1.Userestapis (VICREFRAME-LIKEIGININGOANDOANDOSFLASHINGYTHON) ORGRPC

GolangoffersSuperiorperformance, NativeConcurrencyViagoroutines und efficienionResourceuse, MakingidealforHigh-Travaffic, niedrig-ladencyapis;

GouseS sisifificantantlessMemoryThanpythonWhenrunningwebservicesDuetolanguagedesignandConcurrencyModeldifferzen.1.go'sgoroutinesareligweightWithminimalStackoverhead, erlauben, dass

PythonisthedededHedLuGuageForminelearningDuetoitsMatureCosystem, whileofferslightweighttoolsSuitedForspecificusecases

Der Kernunterschied zwischen Go und Python in der Speicherverwaltung sind die unterschiedlichen Müllsammlungsmechanismen. GO verwendet eine gleichzeitige Marke (Markandsweep) GC, die automatisch mit der Programmlogik ausgeführt und ausgeführt wird, und befasst sich effektiv mit kreisförmigen Referenzen. Es ist für hohe Parallelitätsszenarien geeignet, kann aber die Recyclingzeit nicht genau steuern. Während Python hauptsächlich auf die Referenzzählung angewiesen ist und Objektreferenzen sofort freigegeben werden, wenn sie auf Null gesetzt werden. Der Vorteil ist, dass sie sofortig Recycling und einfache Implementierung sind, aber es gibt ein kreisförmiges Referenzproblem, sodass sie das GC -Modul verwenden müssen, um die Reinigung zu unterstützen. In der tatsächlichen Entwicklung eignet sich Go für Hochleistungsserver-Programme besser, während Python für Skriptklassen oder Anwendungen mit geringen Leistungsanforderungen geeignet ist.

Die Kernmethode zur Verwendung von Sync.waitgroup in Go to Wait auf alle Goroutinen für die Erfüllung von Aufgaben ist: 1. Initialisieren Sie die Karteigruppe und rufen Sie hinzufügen (1), bevor Sie jede Goroutine starten; 2. Verwenden Sie Deferwg.done () in jeder Goroutine, um sicherzustellen, dass die Anzahl nach Abschluss der Aufgabe um eins reduziert wird. 3. Die Hauptdarstellung ruft wg.wait () auf, um alle Aufgaben abzuschließen. Dieser Mechanismus eignet sich für Szenarien, in denen Aufgaben gleichzeitig ausgeführt werden und die Ergebnisse zusammengefasst werden, wie z. B. Stapelverarbeitung oder gleichzeitige Anforderungen. HINWEIS Bei Verwendung: Add sollte in der Hauptkorutine aufgerufen werden, erledigt muss mit Verschiebung verwendet werden. Die Karteigruppe sollte in einem Zeiger übergeben werden, um Kopierwerte oder Pfannen zu vermeiden

Python eignet sich für Szenarien, die umfangreiche Anwendbarkeit, reichhaltige Community -Ressourcen und reife Unternehmensunterstützung erfordern. Es verfügt über eine riesige Community, eine reichhaltige Bibliotheks- und Geschäftsunterstützung und ist für Datenwissenschaft, Automatisierung und traditionelle Systemintegration geeignet. 2. Golang ist für Hochleistungs-Backend-Szenarien wie Cloud-native, Microservices und DevOps geeignet. Die Gemeinschaft ist klein, wächst aber schnell. Es verfügt über hervorragende Parallelitätsmodelle und Leistung und eignet sich für die Modernisierung der Infrastruktur. 3. Die Wahl hängt von den spezifischen Anforderungen des Unternehmens ab: Wenn Sie schnell beginnen und eine breite Palette von Talentreserven haben müssen, wählen Sie Python. Wenn Sie sich auf hohe Parallelität und skalierbare Servicekonstruktion konzentrieren, ist Golang besser. Beide Gemeinden haben ihre eigenen Stärken, und letztendlich sollten Entscheidungen eher auf technischen Zielen als auf absoluten Stärken und Schwächen getroffen werden.

Um Go's Racedetector zu aktivieren, müssen Sie dem Befehl die Flagge -Flagge hinzufügen. Zu den spezifischen Methoden gehören: 1.. Verwenden Sie Gorun-racemain.go beim Ausführen des Programms; 2. Verwenden Sie Getest-Racemypackage beim Testen; 3.. Verwenden Sie beim Erstellen von Binärdateien Gobuild-Race-AMYApp. Das Tool überwacht den Speicherzugriff und meldet Datenrennenprobleme zur Laufzeit, erhöht jedoch die Leistungsaufwand und eignet sich für die Verwendung in den Entwicklungs- und Testphasen. Gemeinsame Konkurrenztypen und Reparaturmethoden umfassen: 1. Entsperrte gemeinsame variable Modifikationen können durch Sync.Mutex -Verriegelung gelöst werden; 2. Die durch unsachgemäßen Kanalgebrauch verursachte Konkurrenz sollte sichergestellt werden, dass ein einzelner Punkt geschlossen wird, oder die Synchronisierung sollte verwendet werden.
