关于GWT,Cookies和网页指导的问题

我正在使用gwt创build一个网站。 这个问题是关于一个login页面和cookie来保存login信息。 GWT允许您在单个网页中创build一个网站。

我的应用程序运行在一个网页上。 我有应用程序设置为,有一个login框的loginbutton,如果细节是正确的,它会加载底层的用户界面,并删除login框。

所以这意味着每次我刷新我的页面的应用程序带我到login页面。 无论如何都要设置一个cookie来保存用户的信息,例如一天,这将input详细信息到login框并自动login,

Web应用程序中的注销button也会删除Cookie中的信息,并将您带到login页面(删除cookie信息并将您引导至网页的login部分)。

或者会有不同的方法。

我会说你几乎是正确的:D这是我在我的应用程序中如何处理login/注销:

  1. 用户加载页面 – 如果他有一个用令牌设置的cookie(请参阅下面的更多信息),将该令牌发送到服务器以检查它是否仍然有效。 如果有效,则login,转到第5点。请参阅下面有关如何处理无效令牌的说明。
  2. 用户input用户/合格组合。 这些信息被发送到服务器(最好通过encryption连接发送,但是用GWT很难实现 – 例如,看到这个问题 )。
  3. 服务器检查用户/ 密码哈希 (见下文)组合是否与数据库中的内容匹配/不pipe。 如果是这样,它会生成一个令牌 (只是一些随机的,相当长的string,如UUID ),并将其发送回客户端。
  4. 如果用户在login过程中勾选了“记住我”checkbox,则将令牌存储在具有将来到期date的cookie中(请参阅其他指南/有关build议时间段的问题)。
  5. 当客户端收到令牌时,应该将其用于每个向服务器发送的请求,只有经过authentication的用户才能执行该请求。 在那里,服务器检查令牌是否有效(你必须跟踪你的数据库中的令牌/用户对),如果是的话,授权交易/无论。 这里有一个问题:如果你仅仅依靠cookie,那么你很容易受到XSRF的攻击 。 这就是为什么你也应该传递令牌(cookie被自动转移 – 这就是为什么XSRF攻击是可能的)作为请求的一部分(你知道,就像JSON中的附加字段或者通过GWT- RPC或甚至HTTP头)。
  6. 在显式注销 (单击“注销”链接等)时,向该用户刚刚注销的服务器发送信息。 然后服务器应该删除/无效的令牌。 无论“记住我”选项,它都应该这样做 – 因为显式注销意味着用户想要删除该PC /浏览器上的login信息,并防止他人以他/她的身份login。 如果用户只是closures了浏览器/页面,并且您已经在第4点正确设置了cookie(也就是说,在浏览器closures时不会过期 – 只有在select“记住我”选项时),在下次访问用户应该自动login到第1点。

一些额外的笔记

  • 这非常重要:请记住检查服务器端是否通过cookie传递的令牌等于作为请求/有效负载的一部分传递的令牌。
  • 不要将密码作为纯文本存储在数据库中 – 存储密码的哈希值。 使用BCrypt以获得最大的安全性。 这就是为什么我写道,你应该比较密码哈希 ,而不是实际的密码。
  • 当服务器遇到无效令牌时,这可能意味着很多事情 – 从正常到警报。 一般情况下,logging这些情况是很好的,并定期检查日志是否有任何exception活动。
    1. 用户没有访问该网站looong时间, 令牌过期 。 确保在客户端正确处理令牌过期(cookie上的正确过期date应导致用户被redirect到login页面,而不发送过期的令牌)和服务器端(一个特殊任务,每天扫描令牌列表并删除过期的?)
    2. 也许你已经对令牌validation设置了一些其他的限制,比如令牌不能过期而且当前的尝试必须来自与最初生成的令牌相同的IP。
    3. 发送请求时发生错误,并且发生错误 /损坏 – 不能做太多的工作,但将用户redirect到login页面
    4. 第三方正在尝试使用手工令牌login 。 如果你用愚蠢的方式猜测令牌(比如基于用户名,rot13,自己的超级特殊的“encryption”等等),那么你迟早被这个怪物咬伤。 UUID是一个好的代币候选者的例子 – 顾名思义,它是一个普遍唯一的标识符 – 意味着没有两个用户应该有相同的UUID,并且UUID本身是随机的和长的。

AJAX应用程序中的安全性是严重的事情 – 我看到太多的Web应用程序容易利用安全漏洞…确保你完全理解你在做什么,为什么。 如果您有任何问题,请不要犹豫,问:)


更新2015-06-12: GWT – 安全RPC XSRF

在这里你可以find关于GWTlogin安全的一些信息。 还有一个关于如何使用cookie来记住用户已经login的部分。

这是一个最好的链接,我通过(完整的implementation )。一个完整的login周期与维护一个cookie( sessionId )。

如果你有一个叫做“ Remember me ”的选项,这样会好很多

GWT中的会话pipe理