如何在 golang/echo 中结合自定义 HTTP 错误处理程序触发 BasicAuth 提示?
How to trigger BasicAuth prompt in conjunction with custom HTTP error handler in golang/echo?
考虑以下示例,它为自定义组使用基本身份验证中间件,还使用自定义 http 错误处理程序:
package main
import (
"net/http"
"strconv"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
// customHTTPErrorHandler utilizies custom error pages in public/error
func customHTTPErrorHandler(err error, c echo.Context) {
code := http.StatusInternalServerError
if he, ok := err.(*echo.HTTPError); ok {
code = he.Code
}
if err := c.String(http.StatusOK, strconv.Itoa(code)); err != nil {
c.Logger().Error(err)
}
}
func main() {
e := echo.New()
e.HTTPErrorHandler = customHTTPErrorHandler
e.Use(middleware.Logger())
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Index\n")
})
g := e.Group("/admin", middleware.BasicAuth(func(u, p string, c echo.Context) (bool, error) {
if u == "test" && p == "test" {
return true, nil
}
return false, nil
}))
g.GET("", func(c echo.Context) error {
return c.String(http.StatusOK, "Admin\n")
})
e.Logger.Fatal(e.Start("localhost:1325"))
}
如果我省略 e.HTTPErrorHandler = customHTTPErrorHandler
则基本身份验证中间件会在所有现代浏览器中触发提示。一旦我使用自定义错误处理程序,我总是在没有提示的情况下 运行 进入 401。
我知道
when basic auth middleware finds invalid credentials it returns 401 - Unauthorized error, aborting the current HTTP request.
如文档中所述 https://echo.labstack.com/guide/error-handling。
在这种情况下,如何让提示再次起作用?我应该写一个自定义的基本身份验证中间件吗?我将如何在其中包含基本身份验证提示?
我也试过在
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error {}})
在上面,但它也不会触发提示。
Curl 请求但是给了我预期的结果:
curl http://localhost:1325/admin
401
curl -u test:test http://localhost:1325/admin
Admin
但是如果我在浏览器中打开以下 url http://test:test@localhost:1325/admin
我 运行 在没有基本身份验证提示的情况下进入相同的错误(401 未授权)。
方法是构建错误我猜应该如下。刚刚显示错误构造缩小范围,需要执行额外检查
func customHTTPErrorHandler(err error, c echo.Context) {
msg := echo.Map{"message": "Unauthorized"}
err = c.JSON(401, msg)
}
您已将 http 状态代码设置为 http.StatusOK
。下线。
if err := c.String(http.StatusOK, strconv.Itoa(code)); err != nil {
应该是401http.StatusUnauthorized
if err := c.String(http.StatusUnauthorized, strconv.Itoa(code)); err != nil {
c.Logger().Error(err)
}
考虑以下示例,它为自定义组使用基本身份验证中间件,还使用自定义 http 错误处理程序:
package main
import (
"net/http"
"strconv"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
// customHTTPErrorHandler utilizies custom error pages in public/error
func customHTTPErrorHandler(err error, c echo.Context) {
code := http.StatusInternalServerError
if he, ok := err.(*echo.HTTPError); ok {
code = he.Code
}
if err := c.String(http.StatusOK, strconv.Itoa(code)); err != nil {
c.Logger().Error(err)
}
}
func main() {
e := echo.New()
e.HTTPErrorHandler = customHTTPErrorHandler
e.Use(middleware.Logger())
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Index\n")
})
g := e.Group("/admin", middleware.BasicAuth(func(u, p string, c echo.Context) (bool, error) {
if u == "test" && p == "test" {
return true, nil
}
return false, nil
}))
g.GET("", func(c echo.Context) error {
return c.String(http.StatusOK, "Admin\n")
})
e.Logger.Fatal(e.Start("localhost:1325"))
}
如果我省略 e.HTTPErrorHandler = customHTTPErrorHandler
则基本身份验证中间件会在所有现代浏览器中触发提示。一旦我使用自定义错误处理程序,我总是在没有提示的情况下 运行 进入 401。
我知道
when basic auth middleware finds invalid credentials it returns 401 - Unauthorized error, aborting the current HTTP request.
如文档中所述 https://echo.labstack.com/guide/error-handling。
在这种情况下,如何让提示再次起作用?我应该写一个自定义的基本身份验证中间件吗?我将如何在其中包含基本身份验证提示?
我也试过在
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error {}})
在上面,但它也不会触发提示。
Curl 请求但是给了我预期的结果:
curl http://localhost:1325/admin
401
curl -u test:test http://localhost:1325/admin
Admin
但是如果我在浏览器中打开以下 url http://test:test@localhost:1325/admin
我 运行 在没有基本身份验证提示的情况下进入相同的错误(401 未授权)。
方法是构建错误我猜应该如下。刚刚显示错误构造缩小范围,需要执行额外检查
func customHTTPErrorHandler(err error, c echo.Context) {
msg := echo.Map{"message": "Unauthorized"}
err = c.JSON(401, msg)
}
您已将 http 状态代码设置为 http.StatusOK
。下线。
if err := c.String(http.StatusOK, strconv.Itoa(code)); err != nil {
应该是401http.StatusUnauthorized
if err := c.String(http.StatusUnauthorized, strconv.Itoa(code)); err != nil {
c.Logger().Error(err)
}