Golang实践录:使用gin实现http basic认证

Posted 李迟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang实践录:使用gin实现http basic认证相关的知识,希望对你有一定的参考价值。

本文介绍使用 Golang 语言实现 http basic 认证,并给出测试。

起因

接前文,按要求,接入内网环境的服务应用不能提供无任何验证方式的post接口,线上系统有相关的模块,但过于复杂。经讨论确定,使用 http basic 认证方式即可。

实现

思路:

  • 调用gin.BasicAuth()创建需认证的路由组,账号密码由配置文件读取(可多个,本文示例略去)。
  • 在该路由组下指定相应的URL及响应函数。
  • 响应函数从gin.Context获取账号,与配置文件的对比,如不同,认证不通过,返回。否则继续后面处理流程。

关键代码示例:

import (
    "net/http"
    "github.com/gin-gonic/gin"
    "conf"
)

func initRoutes(r *gin.Engine) 

    if conf.BasicAuthUser != "" && conf.BasicAuthPass != "" 
        authorized := r.Group("/auth", gin.BasicAuth(gin.Accounts
            conf.BasicAuthUser: conf.BasicAuthPass,
            // "aaa":"bbb",
            // "ccc":"ddd",
        ))

        authorized.POST("/testing", HandleTestingAuth)
        authorized.GET("/testing", HandleTestingAuth)
    

    return


func HandleTestingAuth(ctx *gin.Context) 

    if ctx.MustGet(gin.AuthUserKey).(string) != conf.BasicAuthUser 
        ctx.String(http.StatusUnauthorized, "")
        return
    

    ctx.String(http.StatusOK, "ok....")

其中,conf.BasicAuthUserconf.BasicAuthPass分别是账号和密码变量。

测试

POST测试

$ curl -X POST localhost:9000/auth/testing -i -u latelee:12345678
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 401 Unauthorized
Www-Authenticate: Basic realm="Authorization Required"
Date: Tue, 31 Jan 2023 16:06:28 GMT
Content-Length: 0

$ curl -X POST localhost:9000/auth/testing -i -u latelee:123456
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     6  100     6    0     0   6376      0 --:--:-- --:--:-- --:--:--  6000HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 31 Jan 2023 16:06:30 GMT
Content-Length: 6

ok....

GET测试

chrome浏览器会出现提示,用户名和密码正确后方显示页面。

客户端

使用 ajax 请求示例:

    function calctest() 
        //console.log("param: ", $('#form1').serialize())
        $("#commit").text("请求中");
        $.ajax(
            type: "POST",
            dataType: "text",
            url: "auth/testing",
            authType: "Basic",
            username: "latelee",
            password: "123456",
            data: $('#form1').serialize(),
            success: function (result) 
                $("#commit").html(result);
            ,
            error : function() 
                $("#commit").text("请求失败");
            
        );
    

小结

本文使用的认证方式,实际上不安全,但胜在简单。定期改用户密码可减少风险。至于高阶的方式,后续再研究。

以上是关于Golang实践录:使用gin实现http basic认证的主要内容,如果未能解决你的问题,请参考以下文章

Golang实践录:使用gin实现 cas 单点登录

Golang实践录:使用gin框架实现转发功能:上传文件并转

Golang实践录:使用gin框架实现转发功能:上传文件并转

Golang实践录:使用gin框架实现转发功能:利用nginx转发

Golang实践录:使用gin框架实现转发功能:利用nginx转发

Golang实践录:使用gin框架实现转发功能:管理后端服务