


Implementieren Sie die grundlegende API-Authentifizierung und -Autorisierung mit Go
Mit der kontinuierlichen Entwicklung von Webanwendungen, da Anwendungen immer größer werden, müssen API-Schnittstellen geschützt werden, um zufälligen Zugriff zu verhindern, sodass API-Authentifizierungs- und Autorisierungsmechanismen immer wichtiger werden. In diesem Artikel stellen wir vor, wie Sie mit Go die grundlegende API-Authentifizierung und -Autorisierung implementieren.
Lassen Sie uns zunächst die Grundkonzepte der Authentifizierung und Autorisierung verstehen:
Authentifizierung: Die Authentifizierung ist ein Mechanismus zur Identitätsüberprüfung, mit dem überprüft wird, ob die vom Benutzer angeforderte Identität legitim ist. In Webanwendungen kann die Authentifizierung über Benutzername und Passwort oder über Token wie JWT erfolgen.
Autorisierung: Bei der Autorisierung handelt es sich um einen Berechtigungsüberprüfungsmechanismus, der verwendet wird, um festzustellen, ob der Benutzer das Recht hat, auf die angeforderte Ressource zuzugreifen. In Webanwendungen kann die Autorisierung durch rollenbasierte Zugriffskontrolle oder Zugriffstoken erfolgen.
Die Implementierung der grundlegenden API-Authentifizierung und -Autorisierung in Go kann in die folgenden Schritte unterteilt werden:
Schritt 1: Installieren und konfigurieren Sie das Gin-Framework
Bevor Sie das Gin-Framework verwenden, müssen Sie es zuerst installieren. Wir können es mit dem folgenden Befehl installieren:
go get -u github.com/gin-gonic/gin
Nachdem die Installation abgeschlossen ist, können wir den folgenden Code verwenden, um das Gin-Framework zu initialisieren:
import "github.com/gin-gonic/gin" router := gin.Default()
Schritt 2: Routing hinzufügen
Bevor wir mit dem Hinzufügen von Routen beginnen, müssen wir sie definieren Eine Middleware-Funktion, die verwendet, um zu überprüfen, ob der Benutzer legitim ist. Die Middleware-Funktion prüft die eingehenden Anforderungsheader und gibt einen Statuscode und eine Fehlermeldung an den Handler zurück.
func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 验证用户是否合法 if userValid { c.Set("user", "valid") c.Next() } else { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) } } }
Wir können der Routing-Funktion Middleware-Funktionen hinzufügen, um sicherzustellen, dass nur authentifizierte Benutzer auf die erforderlichen Ressourcen zugreifen können.
router.GET("/secured", AuthMiddleware(), func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "You are authorized to access this resource"}) })
Im obigen Code wird die GET-Anfrage an den /secured-Endpunkt weitergeleitet, aber nur authentifizierte Benutzer können erfolgreich darauf zugreifen.
Schritt 3: JWT-Authentifizierung implementieren
Jetzt haben wir eine Route hinzugefügt und Middleware verwendet, um sicherzustellen, dass der Benutzer für den Zugriff auf die Route authentifiziert ist. Als Nächstes schauen wir uns an, wie Benutzer mithilfe von JWT authentifiziert werden.
JWT ist ein JSON-basierter Web-Token, der eine sichere Möglichkeit zur Übertragung von Informationen zwischen Clients und Servern bietet. JWT besteht normalerweise aus drei Teilen: Header, Payload und Signatur. Der Header enthält den Token-Typ und den Signaturalgorithmus, die Nutzlast enthält die Token-Daten und die Signatur wird zur Überprüfung der Integrität des Tokens verwendet.
Wir können die JWT-Authentifizierung in Go mithilfe des folgenden Codes implementieren:
import ( "time" "github.com/dgrijalva/jwt-go" ) func CreateToken() (string, error) { token := jwt.New(jwt.SigningMethodHS256) claims := token.Claims.(jwt.MapClaims) claims["user"] = "john@example.com" claims["exp"] = time.Now().Add(time.Hour * 24).Unix() tokenString, err := token.SignedString([]byte("secret")) if err != nil { return "", err } return tokenString, nil }
Im obigen Code erstellen wir zunächst ein JWT-Token und fügen dann einen Benutzeranspruch zusammen mit der Ablaufzeit hinzu. Abschließend wird der Token signiert und das Ergebnis zurückgegeben.
Schritt 4: Rollenbasierte Autorisierung implementieren
Im letzten Schritt erfahren Sie, wie Sie mithilfe der rollenbasierten Autorisierung den Benutzerzugriff auf Ressourcen steuern.
Bei der rollenbasierten Zugriffskontrolle werden Benutzer einer oder mehreren Rollen zugewiesen und jeder Rolle wird eine Reihe von Berechtigungen gewährt. Beim Zugriff auf Ressourcen bestimmt das Autorisierungscenter anhand seiner Rolle, auf welche Ressourcen der Benutzer Zugriff hat.
Wir können eine einfache rollenbasierte Autorisierung mit dem folgenden Code implementieren:
func AuthzMiddleware(roles ...string) gin.HandlerFunc { return func(c *gin.Context) { userRole := "admin" // 从数据库或其他地方获取用户角色 for _, role := range roles { if role == userRole { c.Next() return } } c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "Forbidden"}) } }
Im obigen Code definieren wir eine AuthzMiddleware-Middleware-Funktion, die eine Liste von Rollen als Parameter akzeptiert und prüft, ob die Benutzerrolle enthalten ist. Wenn der Benutzer über die erforderliche Rolle verfügt, übergeben Sie die Middleware und fahren Sie mit dem nächsten Handler fort. Andernfalls geben Sie einen Statuscode „Verboten“ zurück.
Schließlich können wir der Route die Funktion AuthzMiddleware hinzufügen, um sicherzustellen, dass nur Benutzer mit bestimmten Rollen Zugriff auf die erforderlichen Ressourcen haben.
router.GET("/admin", AuthMiddleware(), AuthzMiddleware("admin"), func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "You are authorized to access this resource"}) })
Die oben genannten Schritte sind die grundlegenden Schritte zur Implementierung der grundlegenden API-Authentifizierung und -Autorisierung mit Go. Diese grundlegenden Implementierungen können als Grundlage für eine Anwendung dienen und bei Bedarf weiter angepasst und erweitert werden.
Das obige ist der detaillierte Inhalt vonImplementieren Sie die grundlegende API-Authentifizierung und -Autorisierung mit Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

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

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

Undress AI Tool
Ausziehbilder kostenlos

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)

Heiße Themen



In Go können WebSocket-Nachrichten mit dem Paket gorilla/websocket gesendet werden. Konkrete Schritte: Stellen Sie eine WebSocket-Verbindung her. Senden Sie eine Textnachricht: Rufen Sie WriteMessage(websocket.TextMessage,[]byte("message")) auf. Senden Sie eine binäre Nachricht: Rufen Sie WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) auf.

In Go umfasst der Funktionslebenszyklus Definition, Laden, Verknüpfen, Initialisieren, Aufrufen und Zurückgeben; der Variablenbereich ist in Funktionsebene und Blockebene unterteilt. Variablen innerhalb einer Funktion sind intern sichtbar, während Variablen innerhalb eines Blocks nur innerhalb des Blocks sichtbar sind .

In Go können Sie reguläre Ausdrücke verwenden, um Zeitstempel abzugleichen: Kompilieren Sie eine Zeichenfolge mit regulären Ausdrücken, z. B. die, die zum Abgleich von ISO8601-Zeitstempeln verwendet wird: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Verwenden Sie die Funktion regexp.MatchString, um zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt.

Go und die Go-Sprache sind unterschiedliche Einheiten mit unterschiedlichen Eigenschaften. Go (auch bekannt als Golang) ist bekannt für seine Parallelität, schnelle Kompilierungsgeschwindigkeit, Speicherverwaltung und plattformübergreifende Vorteile. Zu den Nachteilen der Go-Sprache gehören ein weniger umfangreiches Ökosystem als andere Sprachen, eine strengere Syntax und das Fehlen dynamischer Typisierung.

Speicherlecks können dazu führen, dass der Speicher des Go-Programms kontinuierlich zunimmt, indem: Ressourcen geschlossen werden, die nicht mehr verwendet werden, wie z. B. Dateien, Netzwerkverbindungen und Datenbankverbindungen. Verwenden Sie schwache Referenzen, um Speicherlecks zu verhindern, und zielen Sie auf Objekte für die Garbage Collection ab, wenn sie nicht mehr stark referenziert sind. Bei Verwendung von Go-Coroutine wird der Speicher des Coroutine-Stapels beim Beenden automatisch freigegeben, um Speicherverluste zu vermeiden.

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Beim Übergeben einer Karte an eine Funktion in Go wird standardmäßig eine Kopie erstellt und Änderungen an der Kopie haben keinen Einfluss auf die Originalkarte. Wenn Sie die Originalkarte ändern müssen, können Sie sie über einen Zeiger übergeben. Leere Karten müssen mit Vorsicht behandelt werden, da es sich technisch gesehen um Nullzeiger handelt und die Übergabe einer leeren Karte an eine Funktion, die eine nicht leere Karte erwartet, einen Fehler verursacht.

In Golang können Sie mit Fehler-Wrappern neue Fehler erstellen, indem Sie Kontextinformationen an den ursprünglichen Fehler anhängen. Dies kann verwendet werden, um die von verschiedenen Bibliotheken oder Komponenten ausgelösten Fehlertypen zu vereinheitlichen und so das Debuggen und die Fehlerbehandlung zu vereinfachen. Die Schritte lauten wie folgt: Verwenden Sie die Funktion „errors.Wrap“, um die ursprünglichen Fehler in neue Fehler umzuwandeln. Der neue Fehler enthält Kontextinformationen zum ursprünglichen Fehler. Verwenden Sie fmt.Printf, um umschlossene Fehler auszugeben und so mehr Kontext und Umsetzbarkeit bereitzustellen. Wenn Sie verschiedene Fehlertypen behandeln, verwenden Sie die Funktion „errors.Wrap“, um die Fehlertypen zu vereinheitlichen.
