Javascript 基本身份验证是正确的选择吗?
我一直在使用Dropwizard为我的webapp开发RESTful后端。现在,在开发前端时,我需要让用户登录。我一直在使用@Auth注释,例如:Javascript 基本身份验证是正确的选择吗?,javascript,java,security,dropwizard,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 endT
@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中,那么对于可以访问计算机的人来说,它不是明文?我应该一直使用用户访问令牌吗?在这种情况下,我建议您使用AUTH 2身份验证系统
使用某种会话令牌几乎总是最佳选择。您只需发送用户名和密码一次,然后就可以获得一个会话令牌,用于在所有其他请求中标识用户 这里有很多优点:
点1-2在任何系统中都很好,因为它们使会话总体上更安全。当您设计公共API时,第2-4点特别有用,因为您可以使用协议,例如为第三方应用程序提供对应用程序全部或部分的安全且可撤销的访问,而无需向该第三方提供用户名或密码。如其他人所述,令牌很好,因为您可以控制它们,如果需要可以撤销等等。您只应该存储令牌客户端。如果将密码存储在服务器数据库中,仍应将其加密,以防数据库受损 只需理解JWT与其他不透明令牌和机制之间的区别。JWT将信息直接存储在令牌中,并经过签名(尽管未加密),因此您不存储个人可识别信息,而存储用户id或类似信息 我写了一篇关于各种令牌类型的安全相关博客文章,使用Cookies和本地存储等等。
另外,看一看。它概述了JWTs的工作原理。(顺便说一句,我与Auth0没有关联,但我们公司使用它们,Moesif)。因此,必须存储一个用户名->用户\u令牌与某个生命周期的关系?@Amnestic是的,基本上就是这样。@Amnestic您还需要确保令牌是长的且随机生成的(如果可能,最好使用加密随机性)所以人们不能仅仅猜测他们是否能够访问某个用户。我只想向其他人添加这样做,DropWizard有一个OAuth2身份验证过滤器。您可以将其用于任何会话密钥,这允许您在方法上继续使用@Auth。