基本身份验证是正确的选择吗?

时间:2016-11-03 23:41:00

标签: javascript java security dropwizard

我一直在使用Dropwizard为我的webapp开发RESTful后端。现在,开发前端,我需要登录用户。我一直在使用@Auth注释,例如:

@POST
public void createEvent(@Auth User user, @FormParam("startTime") @NotNull @Min(0) Long startTime,
                        @FormParam("endTime") @NotNull @Min(0) Long endTime) {
    validateEvent(startTime, endTime);
    eventDAO.insertEvent(new Event(Util.convertMillisToDate(startTime), Util.convertMillisToDate(endTime), user.getName()));
}

确保用户已登录。一切都很好,但这是使用http基本身份验证。结果是每次我想要执行操作时都必须将用户名和密码发送到服务器。这引出了一个问题:我应该如何在客户端上存储密码?我是否应该在客户端上散列密码(可能还有它的盐?),这样如果我将它们存储在例如一个cookie,对于可以访问计算机的人来说,它不是明文吗?我一直在使用用户访问令牌吗?

3 个答案:

答案 0 :(得分:2)

使用某种会话令牌几乎总是最好的选择。您只需要发送一次用户名和密码,然后获得一个会话令牌,用于识别所有其他请求中的用户。

这里有许多优点:

  1. 您无需在客户端上存储密码,只需存储会话令牌。
  2. 如果会话遭到入侵(例如,恶意客户端),您可以使令牌无效,您也不必更改密码。
  3. 您可以限制特定令牌的权限。
  4. 您可以让用户为第三方应用生成令牌,而无需为这些应用提供密码。
  5. 点1-2在任何系统中都很不错,因为它们通常会使会话更安全。当您设计公共API时,第2-4点特别有用,因为您可以使用OAuth 2.0之类的协议为第三方应用程序提供对应用程序的全部或部分内容的安全和可撤销访问,而无需泄露用户名或该第三方的密码。

答案 1 :(得分:0)

在这种情况下,我建议您使用AUTH 2身份验证系统。

  1. 重要的是Hashing不加密并添加到即使存储的cookie也可以访问。
  2. 使用令牌,您允许用户使用他们的帐户登录第三方应用程序,并减轻痛苦。

答案 2 :(得分:0)

正如其他人所说,令牌很棒,因为你可以控制它们,如果需要可以撤销等等。你只应该存储令牌客户端。如果将密码存储在服务器Db中,则在Db被泄露的情况下仍应保留密码。

了解JWT与其他不透明令牌和机制之间的区别。 JWTS直接在令牌中存储信息并进行签名(尽管未加密),因此您不会存储个人身份信息,而是存储user_id或类似信息。

我使用Cookie与本地存储等编写了一篇关于各种令牌类型的安全相关博客文章。 https://www.moesif.com/blog/technical/restful-apis/Authorization-on-RESTful-APIs/

另外,请查看https://jwt.io/introduction。它概述了JWT的工作原理。 (我与Auth0 BTW没有任何关系,但我们将它们用于我们公司,Moesif)。