这个问题是关于一般网络应用程序登录流程的问题。我对在保持安全性的同时优化可用性和性能的答案最感兴趣。
处理对书签 URL 的未经身份验证请求的最合适方法是什么?
为了演示该问题,以下是示例应用程序的一些路由和各自的行为:
GET /login -> Display the authentication form
POST /processLogin -> process the username and password,
if unauthentic...re-render the login form;
otherwise...display the default page
GET /secret -> if authenticated...display the secret resource;
otherwise...display a login form
POST /secret -> if authenticated...perform a desirable, but potentially
non-idempotent action on the secret
resource
otherwise...display a login form
选项 1:显示登录屏幕,重定向到所需页面
- 用户点击书签
- GET /secret -> 200, 偷偷显示带有隐藏字段path="/secret"的登录表单
- POST /processLogin -> 302 到 /secret(路径参数的值)
- GET /secret -> 200,显示秘密资源
分析:希望您的客户端是现代浏览器,不兼容 HTTP,因此它在 302 的 POST 之后执行 GET。这适用于所有方面。我应该担心吗?
选项 2:重定向到登录屏幕,重定向到所需页面
- 用户点击书签
- 获取 /secret -> 302 到 /login
- GET /login via redirect -> 200,登录表单显示隐藏字段path="/secret"
- POST /processLogin -> 302 到 /secret
- GET /secret -> 200,显示秘密资源
分析:和上面一样的问题。增加登录时浏览器显示的URL发生变化,给用户造成混淆,破坏书签、链接共享等问题。
选项3:显示登录屏幕,显示所需页面
- 用户点击书签
- GET /secret -> 200,偷偷地显示登录表单,操作为 =“/secret”
- POST /secret -> 200,显示秘密资源
分析:可悲的是,刷新按钮现在也坏了:刷新将导致用户代理重新发布并发出警告,而不是重新获取 /secret。他们的用户会收到警告,但如果他们忽略它,就会发生不好的事情。
从好的方面来说,您可以使用这种技术最大限度地减少往返次数。
选项 4:重定向到登录屏幕,显示所需页面
- 用户点击书签
- 获取 /secret -> 302 到 /processLogin
- 通过重定向获取 /processLogin -> 200,登录表单显示为action ="/secret"
- POST /secret -> 302 到 /secret
- GET /secret -> 200,显示秘密资源
分析:与选项 2+4 相同的问题。
选项5:???
我还缺少另一种技术吗?
一般来说,您会推荐哪些技术?
也可以看看
重定向到登录页面时正确的 HTTP 状态代码是什么? 什么样的 HTTP 重定向用于登录? 带有重定向的 HTTP 响应,但没有往返?