为用户会话使用WWW认证HTTP头

2022-02-19 04:52:57

返回用户身份验证是一个复杂的问题,如果我们不';我不想使用cookie或javascript。身份验证对于我们看到的几乎所有web服务都是必要的,有许多工具和协议可以帮助开发人员解决这个问题。使用www-authenticate头,我能够在客户端处理用户会话,而无需任何代码,只需在后端进行一些调整。[1]中提供了该标准的文件。

http www认证头是一个功能强大的工具,也是基本http认证标准的一部分,但我直到最近才意识到这一点,在这篇文章中我';我会告诉你我是如何使用它在我的project tasker上处理用户会话的。

基本上,我们所要做的就是在状态为401的响应上添加http头:WWW-Authenticate。这将使浏览器显示一个对话框,供用户提示输入凭据。这样,浏览器将自动发送授权:。。。请求的标题。

这可以在用户访问登录页面或试图访问私人内容时完成。在我的例子中,我将其添加到登录页面。代码是这样的:

func login(w http.ResponseWriter,r*http.Request){user,pass,ok:=r.BasicAuth()如果!ok{//用户未登录(未发送凭据)w.Header().Set(";WWW-Authenticate";";基本";)w.WriteHeader(http.StatusUnauthorized)return}//检查凭据。。。//如果确定,则将用户重定向到其内容http。重定向(w,r,";/user.html";,http.StatusFound)}

我使用的是基本授权方案,但支持许多其他方案,例如使用MD5、SHA256等的摘要,RFC 7616[2]具有所需的所有信息。

用户填写用户名和密码,并请求相同的路径,但现在浏览器包含授权标题

服务器检查凭据,如果确定,则发送带有新页面位置的重定向状态,例如301。如果不正常,服务器将显示一个错误页面,这样用户可以在刷新后重试

当浏览器在响应中收到此标题时,它们会为用户打开一个对话框,可以设置某些方面,例如,如果在标题上设置了领域,它将为用户显示,但请小心,此选项是有用的,有关详细信息,请检查[1]。chromium上的对话框如下所示:

cliking sign-in(点击登录)会使浏览器重复请求,但具有以下授权:。。。header打开,当我将其设置为Basic scheme时,浏览器将发送base64编码的凭据。

这样做的好处是,浏览器将继续向同一域的后续请求发送凭据,直到收到401状态作为响应。

现在用户可以登录,每次请求私人页面时,我们都必须检查凭据,在这个项目中,我使用了基本方案,所以我使用go';propper http函数:

user,pass,ok:=r.BasicAuth()如果!ok{w.Header().Set(";WWW-Authenticate";,";Basic";)w.WriteHeader(http.StatusUnauthorized)//发送错误页面返回}//检查用户并传递…//服务你的内容

这样,如果由于某种原因请求未经身份验证,服务器将再次请求凭据。这里的另一个选项是将用户重定向到登录页面。

这是方法i';我现在正在使用它,我发现它非常好:它只使用多年来一直存在的标准功能,没有什么新功能;没有客户端javascript或Cookie,这使得维护和满足最苛刻的用户也很容易。