• go语言实现简单认证样例


    1、代码实现样例

    1. package main
    2. import (
    3. "net/http"
    4. "strings"
    5. "github.com/dgrijalva/jwt-go"
    6. "github.com/gin-gonic/gin"
    7. )
    8. var (
    9. // 密钥,用于验证 JWT 令牌
    10. signingKey = []byte("secret")
    11. )
    12. // AuthMiddleware 是一个 Gin 中间件函数,用于验证 JWT 令牌
    13. func AuthMiddleware() gin.HandlerFunc {
    14. return func(c *gin.Context) {
    15. authHeader := c.GetHeader("Authorization")
    16. if authHeader == "" {
    17. c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing Authorization header"})
    18. c.Abort()
    19. return
    20. }
    21. // 从 Authorization 头部提取令牌
    22. parts := strings.Split(authHeader, " ")
    23. if len(parts) != 2 || parts[0] != "Bearer" {
    24. c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid Authorization header format"})
    25. c.Abort()
    26. return
    27. }
    28. tokenString := parts[1]
    29. // 解析令牌
    30. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    31. return signingKey, nil
    32. })
    33. if err != nil {
    34. c.JSON(http.StatusUnauthorized, gin.H{"error": "Failed to parse token"})
    35. c.Abort()
    36. return
    37. }
    38. // 验证令牌
    39. if !token.Valid {
    40. c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})
    41. c.Abort()
    42. return
    43. }
    44. // 将用户信息保存到上下文中
    45. if claims, ok := token.Claims.(jwt.MapClaims); ok {
    46. c.Set("username", claims["username"])
    47. c.Next()
    48. } else {
    49. c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"})
    50. c.Abort()
    51. return
    52. }
    53. }
    54. }
    55. func main() {
    56. r := gin.Default()
    57. // 使用中间件进行认证
    58. r.Use(AuthMiddleware())
    59. // 受保护的路由,需要认证通过才能访问
    60. r.GET("/protected", func(c *gin.Context) {
    61. username, _ := c.Get("username")
    62. c.JSON(http.StatusOK, gin.H{"message": "Hello, " + username.(string)})
    63. })
    64. // 启动服务
    65. r.Run(":8080")
    66. }

    2、postman调用,使用先前生成的token,控制权限,参看我上一篇文章:

  • 相关阅读:
    计算机组成原理知识总结(九)并行组织与结构
    mac vscode 使用 clangd
    测试平台系列(91) 编写oss管理页面
    SCS【10】单细胞转录组之差异表达分析 (Monocle 3)
    在Linux上安装QQ
    光模块厂家如何提高千兆光模块和万兆光模块的可靠性
    ORACLE AutoVue 服务器/桌面版/WebService/SDK安装
    《论文阅读21》Equivariant Multi-View Networks
    移动端适配单位vw和px的转换
    linux opensuse使用mtk烧录工具flashtool
  • 原文地址:https://blog.csdn.net/m0_37570494/article/details/138193795