当前位置:首页 > 文章列表 > Golang > Go问答 > Go:通过证书验证经过身份验证的客户端的后续 http 请求

Go:通过证书验证经过身份验证的客户端的后续 http 请求

来源:stackoverflow 2024-03-04 10:36:21 0浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Go:通过证书验证经过身份验证的客户端的后续 http 请求》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我目前正在编写一个 http 服务器(net/http),它托管多个端点,并在访问这些端点之前需要进行客户端身份验证(步骤 1)。身份验证成功后,服务器会发出一个短期令牌,客户端随后使用该令牌来访问这些端点。当客户端发送令牌(通过 http 标头)时,在每个处理程序函数的开头都有一段代码来检查客户端是否经过身份验证以及所提供的令牌是否有效。我正在寻找一个钩子/包装器,它可以拦截和验证客户端,而不是从每个端点函数调用 isauthenticated(r)

func getMyEndpoint(w http.ResponseWriter, r *http.Request) {
        if valid := isAuthenticated(r); !valid {
            w.WriteHeader(http.StatusUnauthorized)
            io.WriteString(w, "Invalid token or Client not authenticated."
            return
        }
        ...
}

func server() {

        http.HandleFunc("/login", clientLoginWithCertAuth)
        http.HandleFunc("/endpoint1", getMyEndpoint)
        http.HandleFunc("/endpoint2", putMyEndpoint)

        server := &http.Server{
                Addr: ":443",
                TLSConfig: &tls.Config{
                        ClientCAs:  caCertPool,
                        ClientAuth: tls.VerifyClientCertIfGiven,
                },
        }

        if err := server.ListenAndServeTLS("cert.pem", "key.pem"); err != nil {
            panic(err)
        }
}

解决方案


您可以创建一个可以包装 http.handlerfunc 的函数,例如像这样:

func handleauth(f http.handlerfunc) http.handlerfunc {
    return func(w http.responsewriter, r *http.request) {
        if valid := isauthenticated(r); !valid {
            w.writeheader(http.statusunauthorized)
            io.writestring(w, "invalid token or client not authenticated.")
            return // this return is *very* important
        }
        // now call the actual handler, which is authenticated
        f(w, r)
    }
}

现在您还需要注册您的处理程序以通过将其包装在您的其他 http.handlerfuncs 上来使用它(仅那些明显需要身份验证的处理程序):

func server() {
        // No authentication for /login
        http.HandleFunc("/login", clientLoginWithCertAuth)

        // Authentication required
        http.HandleFunc("/endpoint1", handleAuth(getMyEndpoint))
        http.HandleFunc("/endpoint2", handleAuth(putMyEndpoint))

        server := &http.Server{
                Addr: ":443",
                TLSConfig: &tls.Config{
                        ClientCAs:  caCertPool,
                        ClientAuth: tls.VerifyClientCertIfGiven,
                },
        }

        if err := server.ListenAndServeTLS("cert.pem", "key.pem"); err != nil {
            panic(err)
        }
}

这样,只有当 isauthenticated 针对该请求返回 true 时,您的处理程序才会被调用(由 handleauth),而无需在所有处理程序中复制代码。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

版本声明
本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
使用 Google Cloud Storage JSON API 实现可续传上传,并获取上传进度信息的方法使用 Google Cloud Storage JSON API 实现可续传上传,并获取上传进度信息的方法
上一篇
使用 Google Cloud Storage JSON API 实现可续传上传,并获取上传进度信息的方法
在测试Go Kit微服务功能时,可能会遇到数据库错误
下一篇
在测试Go Kit微服务功能时,可能会遇到数据库错误
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    59次使用
  • Gradio是什么?Python开源库快速构建机器学习Web演示界面
    Gradio
    Gradio是一个用于构建机器学习和数据科学Web应用的开源Python库。支持快速创建交互界面,获Google、Meta等大厂青睐,适合模型演示、部署反馈及调试。
    56次使用
  • AutoGPT是什么?开源AI Agent自动化工作流平台详解与使用教程
    AutoGPT
    AutoGPT是基于GPT-4的开源AI代理平台,拥有超10万GitHub星标。本文介绍其低代码界面、自动化工作流功能、系统配置要求及安装步骤,助您高效部署和管理AI Agent。
    56次使用
  • 腾讯扣叮官网:青少年编程教育平台,提供图形化编程、3D创作与虚拟仿真实验室
    腾讯扣叮
    腾讯扣叮是腾讯推出的6-18岁青少年编程学习平台,依托游戏与AI技术,提供图形化编程、3D创作、虚拟实验室及丰富赛事课程,助力培养计算思维与创新能力。
    58次使用
  • 堆友AI学习平台介绍:阿里认证课程与AIGC设计实战指南
    堆友AI学习
    堆友AI学习是堆友推出的专业AI设计教育平台,提供从基础到进阶的线上课程及线下实训营。结合阿里国际AITIC认证,通过视频教程、笔记分享和实战案例,帮助设计师掌握AIGC技能,提升职业竞争力。
    61次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码