2

我正在构建一个带有后端和前端的 Web 应用程序,后端构建在 scala 中,前端构建在 html、css、jquery(backbone.js、jquery.js、underscore.js)中。

如何创建登录?所以基本上你可以将前端视为一个应用程序,我们只向其余后端发出 json 请求。

感谢帮助。

4

1 回答 1

8

Scala 与否,JSON 与否,XHR 与否,机制仍然相同。您将登录名和密码发送到服务器(在客户端对密码进行盐哈希处理以使其更安全),服务器对其进行身份验证(检查登录名和密码是否与数据库中的匹配),然后为用户创建一个会话(在数据库或内存中 - 取决于您的需要)并将会话 ID 作为 cookie 发送给用户(AJAX 请求/响应应该与 cookie 一起正常工作)。

现在,在每个请求中,您检查会话 cookie 并验证它是否指向有效用户(即,它是否指向任何东西)。注销就像删除具有给定 ID 的会话条目一样简单。ID 应该以这样的方式创建:首先:它很长(以最大程度地减少会话劫持的威胁),其次:它包含编码的日期(以便您可以清除过期的会话)。

这就是所谓的基于表单的身份验证

// 编辑

让我回答评论中的问题。会话如何工作?

服务器创建会话。Session 只是 DB 中的表,有 2 列:ID 和 Value(在这里,您将保存以 JSON 编码的会话数据,并在必要时进行压缩,例如您想从 eShop 购买的东西)。当客户端成功通过身份验证时,服务器通过 cookie 将会话 ID 发送给用户。因此服务器必须在响应中添加以下标头:

Set-Cookie: session=ID32445235423tdwfnmm; Expires=Wed, 09 Jun 2012 10:18:14 GMT

现在浏览器理解了这个标头并为客户端设置了 cookie。从这一点开始,每当您发出请求时,浏览器都会自动将 cookie 添加到请求中,因此从现在开始的每个请求都将具有以下标头

Cookie: session=ID32445235423tdwfnmm; other_cookie:other_value;

除非日期在 之后Wed, 09 Jun 2012 10:18:14 GMT。如果是这种情况,那么我们的会话 cookie 将被省略(请注意,这与在服务器端销毁会话不同,您必须手动处理)。

现在您必须Cookie在服务器端解码标头并检索 ID。在这一点上使用一些框架是一个好主意,因为在每个请求中编写解码代码是一种不好的做法。您应该在这里使用所谓的中间件。现在这个中间件检索 ID,检查数据库中的会话并将结果(即用户是否通过身份验证)存储在请求对象中以供稍后使用(即在最终请求处理程序中)。

如您所见,您根本不使用 JavaScript。

此外,您仅在登录请求上设置 cookie (尽管您可以在每个请求上设置它以减少会话劫持问题 - 但这更加复杂)。存储 ID 是浏览器的工作。在服务器端,您只检查Cookie标头是否包含session密钥。

于 2012-04-26T10:38:34.363 回答