(我在 Twitter 上被告知我在这里太含糊了,所以我会尝试进行编辑)
我刚刚开始将 Knockout.js 用于具有 PHP 后端(输出 JSON 结果的 API)的应用程序。该应用程序的某些部分将要求用户经过身份验证才能使用它们(这是一个用于投票决定谁“赢得”梦幻棒球联盟中特定交易的应用程序)
我想知道人们如何使用服务器端 API 和 Knockout 等框架进行身份验证。我可以轻松编写 PHP 代码,该代码接受凭据、验证它们,并返回响应,我只是不知道如何使用 Knockout 维护用户已“经过身份验证”的状态。
此外,在多个页面上维护“经过身份验证的状态”也存在问题,我想知道这如何可能。在 PHP 中,您可以将这些内容存储在 session 中,甚至可以使用 cookie。
我有丰富的 PHP 经验,所以我不担心这个小项目的 API 部分。我是 Knockout.js 的初学者(介于 Javascript 的初学者和中级之间),所以任何有关我如何实现这一目标的提示将不胜感激。
最佳答案
不存储经过身份验证的状态。使用响应代码,就像使用任何其他 API 一样。
最终后端流程(简化到极致)将是这样的:
- 从前端/客户端收到请求
- 此请求是否需要权限
- 不,转到 4
- 是的,转到 3
- 用户是否已被识别
- 不,请回复 401
- 是,但权限不足,请回复 403
- 是的,转到 4
- 发送回复
在前端/客户端:
- 向 API 发送请求
- 响应是 HTTP 200
- 是的,转到 4
- 不,转到 3
- 是 401 吗?
- 是,显示登录屏幕
- 否,触发错误
- 显示结果
如果您突然面临登录屏幕,这可能不是最好的用户体验设计。不过,这可以通过允许用户在任何时间点进行身份验证来规避,但要求除非绝对必要。 (为了获得最终的流畅性,您需要能够在身份验证成功后重放失败的请求。)
当然,对于后续请求,这要求您在服务器上运行 session ,或者您的传输层可以透明地附加 OAuth token 或类似于身份验证后的请求。
本质上,这与存储经过身份验证的状态相同,但更加透明,并且在任何时候都不会假设状态就是标志所说的那样。例如,假设您使用存储在 memcached 中的 session ,该 session 会出现段错误并重新启动。这意味着您的 session 已经消失,任何经过身份验证的人都不再存在。如果您的前端仍然具有 authenticated = true
并依赖它,那么事情就会崩溃。
更新:
睡了一夜之后,我发现你必须区分401和403。因为可能存在不同级别的用户,所以你需要403来告诉前端/客户端,即使这个用户可能已通过身份验证,但他仍然不被允许访问。
关于javascript - Knockout.js 应用程序中的用户身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322377/