【发布时间】:2012-05-07 01:50:25
【问题描述】:
我正在构建一个有后端和前端的 Web 应用程序,后端构建在 scala 中,前端构建在 html、css、jquery(backbone.js、jquery.js、underscore.js)中。
如何创建登录名?所以基本上你可以将前端视为一个应用程序,我们只向其余后端发出 json 请求。
感谢您的帮助。
【问题讨论】:
标签: javascript html session scala rest
我正在构建一个有后端和前端的 Web 应用程序,后端构建在 scala 中,前端构建在 html、css、jquery(backbone.js、jquery.js、underscore.js)中。
如何创建登录名?所以基本上你可以将前端视为一个应用程序,我们只向其余后端发出 json 请求。
感谢您的帮助。
【问题讨论】:
标签: javascript html session scala rest
Scala 与否,JSON 与否,XHR 与否,机制仍然相同。您将登录名和密码发送到服务器(在客户端对密码进行盐哈希处理以使其更安全),服务器对其进行身份验证(检查登录名和密码是否与数据库中的匹配),然后为用户创建一个会话(在数据库或内存中 - 取决于您的需要)并将会话 ID 作为 cookie 发送给用户(AJAX 请求/响应应该与 cookie 一起正常工作)。
现在在每个请求中检查会话 cookie 并验证它是否指向有效用户(即它是否指向任何东西)。注销就像删除具有给定 ID 的会话条目一样简单。 ID 的创建方式应该首先:它很长(以最大程度地减少会话劫持的威胁),其次:它包含编码的日期(以便您可以清除过期的会话)。
这就是所谓的Form-based Authentication。
// 编辑
让我回答 cmets 中的问题。会话如何工作?
服务器创建会话。 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 键。
【讨论】: