码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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,控制权限,参看我上一篇文章:

  • 相关阅读:
    【人工智能】企业如何使用 AI与人工智能的定义、研究价值、发展阶段的深刻讨论
    【JavaScript】 一万字 JavaScript 笔记(详细讲解 + 代码演示 + 图解)
    M4Singer ubuntu 22.04 4060ti16g ModuleNotFoundError: No module named ‘gradio‘
    强化学习从基础到进阶-案例与实践[4]:深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
    【毕业设计】树莓派单片机墨水屏电子日历系统 - 物联网 嵌入式
    CentOS 6.6系统怎么安装?CentOS Linux系统安装配置图解教程
    MYSQL运维篇(已完结)
    Postman基础功能-前置脚本与接口关联
    什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?
    案例解读【淘宝API接口的运用:抓取用户数据从而驱动精准营销
  • 原文地址:https://blog.csdn.net/m0_37570494/article/details/138193795
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号