【问题标题】:Rest api sessions休息 api 会话
【发布时间】:2012-05-07 01:50:25
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

    标签: javascript html session scala rest


    【解决方案1】:

    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 键。

    【讨论】:

    • 很好的答案,非常感谢,很抱歉我的初学者问题。当我构建一个移动应用程序时,它们基本上也会存储 cookie?
    • @user1328997 没问题。我不确定手机(从未使用过它们),但我相信它们确实如此。
    • 好吧。还有一件事,在身份验证之后,服务器创建了会话,向客户端返回了一个会话 id(以 json 格式),javascript 创建了 cookie,之后会发生什么?对于每个请求,我都会发送会话 ID?
    • 对这样的框架有什么想法,比如 Java/Servlet 引擎?我正在考虑一个过滤器实现(Tomcat)。
    • @RonnieKilsbo 取决于您使用的语言。我是一名 Python 程序员,所以我建议使用 Django。
    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 2012-06-02
    • 2023-03-06
    • 2014-11-09
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多