对于那些在Go中构建RESTful api和JS前端应用程序的人,你们是如何管理身份验证的?您是否使用了特定的库或技术?
我惊讶地发现关于这方面的讨论如此之少。我一直牢记以下答案,并试图避免开发自己的实现:
ASP中的认证表单。网
每个人都单独编写自己的解决方案吗?
对于那些在Go中构建RESTful api和JS前端应用程序的人,你们是如何管理身份验证的?您是否使用了特定的库或技术?
我惊讶地发现关于这方面的讨论如此之少。我一直牢记以下答案,并试图避免开发自己的实现:
ASP中的认证表单。网
每个人都单独编写自己的解决方案吗?
当前回答
另一个使用cookie处理身份验证的开源包是httpauth。
(顺便说一下,是我写的)
其他回答
2018年回答这个问题。我建议使用JWT(JSON Web Token)。你标记解决的答案有缺点,这是它做了前(用户)和后(服务器/db)的旅行。更糟糕的是,如果用户频繁请求需要认证,将导致从/到服务器和数据库的请求膨胀。为了解决这个问题,使用JWT将令牌存储在用户端,用户可以在任何需要访问/请求的时候使用它。不需要访问数据库和服务器处理来检查令牌有效性,只需很短的时间。
您将使用中间件进行身份验证。
您可以尝试go-http-auth进行基本和摘要身份验证,尝试gnomauth进行OAuth2身份验证。
但如何进行身份验证实际上取决于你的应用程序。
身份验证将状态/上下文引入http。最近有一些关于这个问题的讨论。
上下文问题的著名解决方案是这里描述的gorilla/context和谷歌context。
我做了一个更通用的解决方案,在go-on/wrap中不需要全局状态,可以一起使用,也可以不需要其他两个,并且很好地与上下文无关的中间件集成。
Wraphttpauth提供了go-http-auth与go-on/wrap的集成。
另一个使用cookie处理身份验证的开源包是httpauth。
(顺便说一下,是我写的)
看看Labstack Echo——它将RESTful API和前端应用程序的身份验证包装到中间件中,您可以使用它来保护特定的API路由。
例如,设置基本的身份验证就像为/admin路由创建一个新的子外部一样简单:
e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
if username == "joe" && password == "secret" {
return true, nil
}
return false, nil
}))
点击这里查看Labstack的所有中间件身份验证选项。
另一个可能的解决方案是Authboss,最近在邮件列表中宣布。
(我还没有试过使用这个库。)
另见最好的方法使一个web应用程序与用户认证?