mongodb启用身份验证_为您的Web应用程序启用两因素身份验证

mongodb启用身份验证

支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统。 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 。

启用它们需要类似的流程:

  • 用户转到其个人资料页面(如果要在注册时强制使用2fa,请跳过此页面)
  • 单击“启用双重身份验证”
  • 输入一些数据以启用特定的2FA方法(电话号码,TOTP验证码等)
  • 下次他们登录时,除了用户名和密码外,登录表单还会请求第二个因素(验证码)并将其与凭据一起发送

我将重点介绍Google Authenticator,它使用TOTP(基于时间的一次性密码)生成一系列验证码。 想法是服务器和客户端应用程序共享一个密钥。 基于该键和当前时间,两者都使用相同的代码。 当然,时钟不能完全同步,因此服务器会接受一些窗口作为有效代码。 请注意,如果您不信任Google的应用程序,则可以使用下面的相同库来实现自己的客户端应用程序(尽管您可以查看源代码以确保没有恶作剧发生)。

如何用Java(在服务器上)实现它? 使用GoogleAuth库 。 流程如下:

  • 用户转到其个人资料页面
  • 单击“启用双重身份验证”
  • 服务器生成一个秘密密钥,将其存储为用户配置文件的一部分,并将URL返回到QR码
  • 用户使用其Google Authenticator应用程序扫描QR码,从而在该应用程序中创建新的个人资料
  • 用户在与QR码一起显示的字段中输入应用程序显示的验证码,然后点击“确认”
  • 服务器在用户配置文件中将2FA标记为已启用
  • (可选)您可以为用户提供一些“便签代码”,以防他们丢失应用程序或机密信息时可以写下来。
  • 如果用户不扫描代码或不验证过程,则用户个人资料将仅包含孤立的秘密密钥,但不会被标记为已启用
  • 应该有一个选项,以后可以从其用户个人资料页面禁用2FA

从理论的角度来看,最重要的一点是共享密钥。 密码是对称的,因此双方(身份验证器应用程序和服务器)具有相同的密钥。 它通过用户扫描的QR码共享。 如果此时攻击者可以控制用户的计算机,则机密可能会泄露,从而2FA也会被攻击者滥用。 但这不在威胁模型中,换句话说,如果攻击者可以访问用户的计算机,则无论如何都已经造成了破坏。

注意:您可能会看到此过程称为2步身份验证或2因子。 “因素”是:“您知道的东西”,“您拥有的东西”和“您拥有的东西”。 您可以将TOTP视为“您知道”的另一件事,但也可以将带有安全存储的密钥的电话视为“您拥有的”东西。 在这种特殊情况下,我不坚持使用任何一种术语。

登录后,流程如下:

  • 用户输入用户名和密码,然后单击“登录”
  • 使用AJAX请求,页面询问服务器此电子邮件是否已启用2FA
  • 如果未启用2FA,只需提交用户名和密码表格
  • 如果启用了2FA,则不会提交登录表单,而是显示一个附加字段,以允许用户从身份验证器应用程序中输入验证码
  • 用户输入代码并按登录后,即可提交表单。 使用相同的登录按钮,或使用新的“验证”按钮,或使用验证输入+按钮可能是一个全新的屏幕(隐藏用户名/密码输入)。
  • 然后,服务器再次检查用户是否启用了2FA,如果是,则验证验证码。 如果匹配,则登录成功。 如果不是,则登录失败,并且允许用户重新输入凭据和验证码。 请注意,根据用户名/密码错误或代码错误,您可能会有不同的响应。 您也可以在显示验证码输入之前尝试登录。 这种方法可以说是更好的方法,因为这样您就不会向潜在的攻击者透露用户使用2FA。

我说的是用户名和密码,这可以适用于任何其他身份验证方法。 从OAuth / OpenID Connect / SAML提供程序获得成功确认之后,或者从SecureLogin获得令牌之后,您可以请求第二个因素(代码)。

在代码中,上述过程如下所示(使用Spring MVC;为了简洁起见,我将控制器和服务层合并。您可以使用将当前登录的用户详细信息提供给控制器的方式替换@AuthenticatedPrincipal位)。 假设方法在控制器中映射到“ / user /”:

@RequestMapping(value = "/init2fa", method = RequestMethod.POST)
@ResponseBody
public String initTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token) {User user = getLoggedInUser(token);GoogleAuthenticatorKey googleAuthenticatorKey = googleAuthenticator.createCredentials();user.setTwoFactorAuthKey(googleAuthenticatorKey.getKey());dao.update(user);return GoogleAuthenticatorQRGenerator.getOtpAuthURL(GOOGLE_AUTH_ISSUER, email, googleAuthenticatorKey);
}@RequestMapping(value = "/confirm2fa", method = RequestMethod.POST)
@ResponseBody
public boolean confirmTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token, @RequestParam("code") int code) {User user = getLoggedInUser(token);boolean result = googleAuthenticator.authorize(user.getTwoFactorAuthKey(), code);user.setTwoFactorAuthEnabled(result);dao.update(user);return result;
}@RequestMapping(value = "/disable2fa", method = RequestMethod.GET)
@ResponseBody
public void disableTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token) {User user = getLoggedInUser(token);user.setTwoFactorAuthKey(null);user.setTwoFactorAuthEnabled(false);dao.update(user);
}@RequestMapping(value = "/requires2fa", method = RequestMethod.POST)
@ResponseBody
public boolean login(@RequestParam("email") String email) {// TODO consider verifying the password here in order not to reveal that a given user uses 2FAreturn userService.getUserDetailsByEmail(email).isTwoFactorAuthEnabled();
}

QR码生成使用Google的服务,从技术上讲,它也为Google提供了秘密密钥。 我怀疑它们除了生成QR码外还会存储它,但是,如果您不信任它们,则可以实现自己的QR码生成器, 那么自己生成QR码应该不难 。

在客户端,它是对上述方法的简单AJAX请求(旁注:我觉得AJAX一词不再流行,但我不知道如何称呼它们。是异步的还是背景的Javascript?)。

$("#two-fa-init").click(function() {$.post("/user/init2fa", function(qrImage) {$("#two-fa-verification").show();$("#two-fa-qr").prepend($('<img>',{id:'qr',src:qrImage}));$("#two-fa-init").hide();});
});$("#two-fa-confirm").click(function() {var verificationCode = $("#verificationCode").val().replace(/ /g,'')$.post("/user/confirm2fa?code=" + verificationCode, function() {$("#two-fa-verification").hide();$("#two-fa-qr").hide();$.notify("Successfully enabled two-factor authentication", "success");$("#two-fa-message").html("Successfully enabled");});
});$("#two-fa-disable").click(function() {$.post("/user/disable2fa", function(qrImage) {window.location.reload();});
});

登录表单代码在很大程度上取决于您正在使用的现有登录表单,但是重点是使用电子邮件(和密码)调用/ requires2fa以检查是否启用了2FA,然后显示验证码输入。

总体而言,两因素身份验证的实现很简单,我建议在大多数系统中使用它,因为安全性比简单的用户体验更为重要。

翻译自: https://www.javacodegeeks.com/2017/10/enabling-two-factor-authentication-web-application.html

mongodb启用身份验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 数据库命令之 mysqlshow -- 显示 MySQL 数据库相关信息

文章目录介绍语法格式常用选项参考示例&#xff08;一&#xff09;显示指定数据库中的所有表的记录数和列数&#xff08;二&#xff09;显示指定数据库中所有的数据表的额外信息&#xff08;三&#xff09;查看指定数据库中的所有数据表&#xff08;四&#xff09;显示所有的数…

java中的gui_java gui快速入门教程

JCheckBox和JRadioButton使用示例import java.awt.*;import javax.swing.*;class Hobby extends JPanel {JCheckBox c1 new JCheckBox("写作",false);JCheckBox c2 new JCheckBox("音乐",false);JCheckBox c3 new JCheckBox("跑步",false);JR…

cad图标注释大全_CAD源泉插件快捷键使用教程(全集)

点击直达全集教程地址​www.bilibili.com此插件和海龙工具箱功能相似&#xff01;不建议同时安装&#xff0c;快捷命令冲突。插件工具箱 图文介绍平面空间布置 jj这个命令把我们常规用到的家装空间都已经用上了&#xff0c;除了切换不同空间布置格局&#xff0c;而且图块的样式…

java登录界面命令_Java命令行界面(第30部分):观察

java登录界面命令这个有关Java命令行参数解析的系列文章由四个月来发表的29篇帖子组成&#xff0c;涵盖了28个不同的开放源代码库&#xff0c;可用于解析Java命令行参数。 这篇文章收集了可以从本系列的前29篇文章中得出的一些观点&#xff0c;并提供了选择28个库中的一个或决定…

MySQL 数据库命令之 mysqladmin -- MySQL 服务器管理客户端

文章目录一、介绍二、语法格式三、命令参数&#xff08;一&#xff09;参数默认值&#xff08;二&#xff09;默认参数四、支持的管理命令五、参考示例&#xff08;一&#xff09;每隔两秒查看一次服务器的状态&#xff0c;总共重复 5 次&#xff08;二&#xff09;修改 root 密…

分支限界法 tsp java_基于分支限界法的旅行商问题(TSP)一

//分支限界法#include#include#include#includeconst int INF 100000;const int MAX_N 22;using namespacestd;//n*n的一个矩阵intn;int cost[MAX_N][MAX_N];//最少3个点&#xff0c;最多MAX_N个点structNode{bool visited[MAX_N];//标记哪些点走了int s;//第一个点int s_p;/…

苹果录屏功能没有声音_其实苹果手机也有录屏功能!简单操作几步,就能轻松开启...

现在手机中的娱乐方式越来越多了&#xff0c;大家遇到有趣的事情就想分享给朋友&#xff0c;但是一些视频不能直接分享链接&#xff0c;还是挺麻烦的。不过我们可以通过录屏的方式来进行分享的&#xff0c;其实苹果手机就自带录屏工具&#xff0c;简单操作几步&#xff0c;就能…

Linux 启动/重启/停止 MySQL 数据库的命令

文章目录一、启动 MySQL 数据库的命令&#xff08;一&#xff09;使用命令 service 启动&#xff08;二&#xff09;使用命令 systemctl 启动二、停止 MySQL 数据库的命令&#xff08;一&#xff09;使用命令 service 停止&#xff08;二&#xff09;使用命令 systemctl 停止&a…

natty的异步通信框架_OpenHub框架进行的异步通信

natty的异步通信框架在本系列的前一部分中&#xff0c;我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。 当源系统无法等待目标系统的响应时&#xff0c;将使用系统之间的异步通信。 有以下几个原因&#xff1a; 源系统必须尽可能地响应 &am…

java大文件解析_java大文件(百M以上)的上传下载实例解析

javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求&#xff0c;也可以使用 ajax向后端发请求1.通过form表单向后端发送请求Save改进后的代码不需要form标签&#xff0c;直接由控件来实现。开发人员只需要关注业务逻辑即可。JS中已经帮我们封闭好了…

zip直链生成网站_安装网站程序

一、选择网站程序搭建网站的程序有很多博客类&#xff1a; WordPress、 Typecho 、Hexo 等商城类&#xff1a;EcShop、DBShop、NiuShop 等论坛类&#xff1a;Discuz 还有 苹果CMS-影视建站&#xff1b;Tipask-问答程序&#xff1b;可道云KodExplorer-强大易用的私有云/在线文档…

java jni开发_Java JNI开发实践记录

当使用到JNI的时候&#xff0c;基本可以肯定Java的平台移植性注定减弱&#xff0c;接下来记录一次使用Java JNI开发的经历。关于Java JNI的相关资料参见&#xff1a;下面是使用JNI常见三种场景:1.在Java应用中标准Java类库不支持平台相关的特性2.已经存在用其它语言写好的类库&…

Linux 系统服务管理(启动服务/停止服务/重启服务)的命令 - chkconfig/service/systemctl

文章目录一、使用命令 chkconfig 管理系统服务&#xff08;一&#xff09;命令介绍二、使用命令 service 管理系统服务&#xff08;一&#xff09;命令介绍&#xff08;二&#xff09;命令用法1.启动服务2.停止服务3.重启服务4.查看状态三、使用命令 systemctl 管理系统服务一、…

mega x_[MEGA DEAL]通过Hadoop Bundle掌握大数据(91%的折扣)

mega x通过44个小时的广泛Hadoop培训来驯服海量数据集 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了另一个超值优惠 。 通过Hadoop Bundle&#xff0c;我们可以提供91&#xff05;的 大数据精通 折扣 。 现在只需39美元…

c++ 提取傅里叶描述子_AI大语音(四)——MFCC特征提取(深度解析)

1 特征提取流程在语音识别和话者识别方面&#xff0c;最常用到的语音特征就是梅尔倒谱系数&#xff08;Mel-scaleFrequency Cepstral Coefficients&#xff0c;简称MFCC&#xff09;。MFCC提取过程包括预处理、快速傅里叶变换、Mei滤波器组、对数运算、离散余弦变换、动态特征提…

Linux 命令之 grep -- 强大的文本搜索工具/正则表达式搜索

文章目录一、命令介绍二、grep 的三种形式三、常用选项四、正则表达式五、参考示例在指定的文件中查找指定的关键词查看指定文件中含有特定关键词的文本行查看指定文件中所有包含数字的行在指定的目录下递归搜索指定的字符串&#xff0c;将符合的文本行及其文件名输出在指定文件…

java me基础教程 pdf_Java ME手机应用开发技术与案例详解 PDF

资源名称&#xff1a;Java ME手机应用开发技术与案例详解 PDFJava ME手机应用开发技术与案例详解基于Java ME&#xff0c;系统描述了Java ME手机应用开发的各个方面。全书按照Java ME程序的开发流程合理编排内容&#xff0c;分成3个部分依次讲述。第1部分包括第1章-第5章&#…

cli parser_Java命令行界面(第27部分):cli-parser

cli parserCLI Parser最初托管在Google Code上&#xff0c;现在已存档在Google Code上 &#xff0c;现在可以在GitHub上使用 。 Google Code项目档案页面将CLI Parser描述为“使用非常简单&#xff0c;非常小的依赖项”&#xff0c;它使用注释“使非常简洁的主要方法不需要知道…

写一个sql实现以下查询结果_书写高质量SQL的30条建议

以下文章来源&#xff1a;后端程序员必备&#xff1a;书写高质量SQL的30条建议1、查询SQL尽量不要使用select *&#xff0c;而是select具体字段。反例子&#xff1a;select * from employee;正例子&#xff1a;select id&#xff0c;name from employee;理由&#xff1a;只取需…

Linux 命令之 sed -- 功能强大的流式文本编辑器

文章目录一、命令介绍二、命令格式三、常用选项四、sed 子命令五、sed 替换标记六、sed 元字符集七、命令示例&#xff08;一&#xff09;用指定的字符串替换掉指定的字符串&#xff08;二&#xff09;删除文档中的空白行&#xff08;三&#xff09;删除文档中的注释&#xff0…