用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发

GitHub 2FA双重身份验证认证易懂教程 GitHub 2FA双重身份验证认证易懂教程,很多人真的是不会写教程!!!看了几个文章写的断章取义,看不懂。那我就来写个简单易懂的文档吧。 阅读详情


前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读。

首先添加全局对象:

loginForm: 登录表单对象
twoFactorData: 两步验证数据,
showTwoFactorSuccess: 是否显示两步验证成功提示

loginForm: {
    //登录对象
    username: "",
    password: "",
    twoFactorAuthenticationToken: "",
    twoFactorAuthenticationProvider: "Phone",
},
twoFactorData: null,
showTwoFactorSuccess: false,

发送验证码

编写发送验证码函数sendVerificationCode,发送验证码后,启动定时器,60秒后可以再次发送验证码。

   async sendVerificationCode() {
      this.smsSendCd = 60;
      this.timer = setInterval(() => {
        this.smsSendCd--;
        if (this.smsSendCd <= 0) {
          clearInterval(this.timer);
        }
      }, 1000);
      await request(
        `${this.host}api/TokenAuth/SendTwoFactorAuthenticateCaptcha`,
        "post",
        {
          provider: "Phone",
          userId: this.twoFactorData.userId,
        }
      )
        .catch((re) => {
          var res = re.response.data;
          this.errorMessage(res.error.message);
        })
        .then((re) => {
          var res = re.data.result;
          this.showTwoFactorSuccess = true;
          this.showTwoFactorSuccess = false;
          this.successMessage("发送验证码成功");
        });
    },

request 是利用axios库发送带有访问凭证Header请求功能的封装 ,ajaxRequest.ts请参考博文使用 Abp.Zero 搭建第三方登录模块(三):网页端开发

这里使用js-cookie库获取cookie中的访问凭证,并添加到Header中

import { request } from "@/ajaxRequire";
import Cookies from "js-cookie";

const tokenKey = "main_token";
const setToken = (token: string) => Cookies.set(tokenKey, token);
const cleanToken = () => Cookies.remove(tokenKey);
const getToken = () => Cookies.get(tokenKey);

登录

编写登录函数handleLogin:

 async handleLogin() {
      this.loading = true;

      var userNameOrEmailAddress = this.loginForm.username;
      var password = this.loginForm.password;

      var twoFactorAuthenticationToken =
        this.loginForm.twoFactorAuthenticationToken;
      var twoFactorAuthenticationProvider =
        this.loginForm.twoFactorAuthenticationProvider;

      userNameOrEmailAddress = userNameOrEmailAddress.trim();
      await request(`${this.host}api/TokenAuth/Authenticate`, "post", {
        userNameOrEmailAddress,
        password,
        twoFactorAuthenticationToken,
        twoFactorAuthenticationProvider,
      })
        .catch((re) => {
          var res = re.response.data;
          this.errorMessage(res.error.message);
        })
        .then(async (res) => {
          var data = res.data.result;
          if (data.requiresTwoFactorAuthenticate) {
            this.twoFactorData = data;
          } else {
            setToken(data.accessToken);
            setRememberClientToken(data.rememberClientToken);
            await this.getCurrentUser();
          }
        })
        .finally(() => {
          setTimeout(() => {
            this.loading = false;
          }, 1.5 * 1000);
        });
    },

请注意,当需要进行两步验证时,requiresTwoFactorAuthenticate会返回true,同时返回
twoFactorAuthenticationProviders。

退出登录

登出, 将Token以及用户信息置空

<el-button
    :loading="loading"
    type="danger"
    style="width: 100%"
    @click.native.prevent="logout">
    退出登录
</el-button>
logout() {
    setToken(null);
    this.token = null;
    this.userInfo = null;
},

界面控件

在登录表单的HTML中,添加两步验证控件:
显示规则为,当需要两步验证时(即twoFactorData不为空),显示两步验证控件,否则显示登录控件。

根据twoFactorAuthenticationProviders。我们采用了两种方式,一种是短信验证码,一种是邮箱验证码,这里我们采用了elementUI的tab组件,来实现两种方式的切换。

     <el-form
        ref="loginForm"
        :model="loginForm"
        class="login-form"
        autocomplete="on"
        label-position="left"
      >
        <template v-if="twoFactorData == null">
            ...
        </template>
        <template v-else>
          <p>您的账号开启了两步验证,请选择一种认证方式以继续登录</p>
          <el-tabs
            v-model="loginForm.twoFactorAuthenticationProvider"
            tab-position="top"
          >
            <el-tab-pane
              :lazy="true"
              label="SMS短信验证"
              name="Phone"
              :disabled="
                twoFactorData.twoFactorAuthenticationProviders.indexOf(
                  'Email'
                ) == -1
              "
            >
              <el-row>
                <el-col
                  :span="24"
                  style="
                     {
                      margin-bottom: 10px;
                    }
                  "
                >
                  <el-alert
                    v-if="showTwoFactorSuccess"
                    title="验证码已发送至用户的手机号,请查收"
                    type="info"
                  >
                  </el-alert>
                </el-col>
                <el-col :span="24">
                  <el-form-item
                    class="item"
                    prop="twoFactorAuthenticationToken"
                  >
                    <el-input
                      v-model="loginForm.twoFactorAuthenticationToken"
                      :placeholder="'发送验证码后键入验证码'"
                      tabindex="2"
                      autocomplete="on"
                      @blur="capsTooltip = false"
                    >
                      <el-button
                        slot="append"
                        :disabled="smsSendCd > 0"
                        @click="sendVerificationCode"
                        >{{
                          smsSendCd == 0 ? "发送验证码" : smsSendCd + "后重试"
                        }}</el-button
                      >
                    </el-input>
                  </el-form-item>
                </el-col>
              </el-row>
            </el-tab-pane>

            <el-tab-pane
              :lazy="true"
              label="邮箱验证"
              name="Email"
              :disabled="
                twoFactorData.twoFactorAuthenticationProviders.indexOf(
                  'Email'
                ) == -1
              "
            >
              <el-row>
                <el-col :span="24">
                  <el-alert
                    v-if="showTwoFactorSuccess"
                    title="验证码已发送至登录用户对应的邮箱,请查收"
                    type="info"
                  >
                  </el-alert>
                </el-col>
                <el-col :span="24">
                ...
                </el-col>
              </el-row>
            </el-tab-pane>
          </el-tabs>
        </template>

        <el-row type="flex" class="row-bg" justify="center" :gutter="10">
          <el-col :span="10" v-if="twoFactorData != null">
            <el-button
              :loading="loading"
              style="width: 100%"
              @click.native.prevent="twoFactorData = null"
            >
              返回
            </el-button>
          </el-col>
          <el-col :span="10">
            <el-button
              :loading="loading"
              type="primary"
              style="width: 100%"
              @click.native.prevent="handleLogin"
            >
              {{ twoFactorData == null ? "登录" : "继续" }}
            </el-button>
          </el-col>
        </el-row>
      </el-form>

在这里插入图片描述

获取用户信息功能

登录成功后我们要拿到当前用户的信息,存入userInfo对象,并在页面上简单展示

<span>{{ userInfo }}</span>

创建一个获取当前用户的函数

async getCurrentUser() {
    await request(
    `${this.host}${this.prefix}/User/GetCurrentUser`,
    "get",
    null
    )
    .catch((re) => {
        var res = re.response.data;
        this.errorMessage(res.error.message);
    })
    .then(async (re) => {
        var result = re.data.result as any;
        this.userInfo = result;
        this.token = getToken();
        clearInterval(this.timer);

        this.smsSendCd = 0;
        this.currentVerifyingType = null;

        this.successMessage("登录成功");
    });
}

最终效果

在这里插入图片描述

项目地址

Github:matoapp-samples

2FAuth:一个Web应用程序,用于管理您的双向验证(2FA)帐户并生成其安全代码 2FAuth 一个Web应用程序,用于管理您的双向认证(2FA)帐户并生成其安全代码 凭据(登录-密码): 演示 目的 2FAuth是一种基于网络的自我托管替代品,可替代一次性身份验证码(OTP)生成器(如Google Authenticator),专为移动设备和台式机而设计。 它旨在通过干净而合适的界面,使您轻松执行2FA身份验证步骤,无论使用何种设备。 我创建它是因为: 此类应用程序的大多数用户界面会同时显示所有帐户的令牌,并且倒计时非常紧张(我认为) 我希望我的2FA帐户存储在一个独立的数据库中,我可以轻松地备份和还原(您是否已经使用Google Auth中的所有2FA帐户都遇 立即下载

相关推荐

ABP框架之OpenIddict分布式认证授权学习手册v1.0

快进来,带你入坑~~~

github登录双因子验证(2FA)验证码生成免费在线工具

从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,双因子登录说白了就是通过第三方设备证明"你是你自己"的一个措施,Github官方推荐在移动端下载1Password、Authy、Microsoft Authenticator等APP来通过扫码进行验证,其实大可不必如此麻烦,比如这些app都需要科学上网才能安装,登录时无法发送国内手机短信,特别是1Password需要收费,这里提供了免费的github登录双因子验证(2FA)验证码生成在线工具。

thethefighter的专栏 3万+

CISP-PTE八套真题详解(侵删)_cisp-pte 考题与答案,万字长文轻松彻底入门Flutter

接下来就是代码审计了isset()函数用于检测变量是否已设置并且非 NULL代码中base64解码出来是一个base64的一句话木马根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令先用phpinfo();试一下:发现执行成功那么直接写个查看key文件的系统命令(记得最后要加分号)在源代码中找到key。

2401_83947398的博客 4675

验证码的生成及校验

验证码的生成及校验 内容:验证码的刷新,确认时的验证 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>验证码的生成及校验</title> <style type="text/css"> div{ padding: 0px 0px; margin: 0px auto; } a{

飞鱼同学 9029

数据库原理及应用教程课后习题答案 第4版 微课版 陈志泊主编

数据库原理及应用教程 第4版 微课版 陈志泊主编 习题参考答案

共同学习,心怀感激。 5万+

ITIL-IT运维管理-概述

ITIL-IT运维管理-概述 概述 IT服务管理(ITSM)是一套帮助企业对IT系统的规划、研发、实施和运营进行有效管理的方法,是一套方法论。ITSM起源于ITIL(IT Infrastructure Library,IT基础架构标准库),ITIL是CCTA(英国国家电脑局)于1980年开发的一套IT服务管理标准库。它把英国在IT管理方面的方法归纳起来,变成规范,为企业的IT部门提供一套从计划、研发、实施到运维的标准方法。 中文名 IT服务管理 外文名 ITService Management 专家

syjhct的博客 4万+

react 验证码组件_使用React.JS和Twilio服务创建电话号码验证组件。

react 验证码组件 介绍 (Introduction) Phone number verification is required for phone sign-in or Two Factor Authentication (2FA). Twilio provides phone verification services, which we will be using with NodeJ...

weixin_26738395的博客 1802

【open judge】【程设】魔兽世界三开战!

#程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include&lt;typeinfo&gt;)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再...

weixin_40841416的博客 6073

开启Github 2FA验证

github 2FA 验证解决方案

换条路吧,编程没意思的~ 1080

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5788

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

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

支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统。 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 。 启用它们需要类似的流程: 用户转到其个人资料页面(如果要在注册时强制使用2fa,请跳过此页面) 单击“启用两因素身份验证” 输入一些数据以启用特定的2FA方法(电话号码,TOTP验证码等) 下次他们登录时,除了用户名和密码外,登录...

最佳 Java 编程 939

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 81

java生成并展示验证码

第一步:生成验证码   /** * 验证码生成程序 * * * @param model * @return * @throws IOException */ @Login(action = Action.Skip) @ResponseBody @RequestMapping(value = "/login_code", method = RequestMethod.GET)

yank1225的博客 851

Python爬虫实战:新浪财经股票金融数据全方位抓取教程

本教程系统介绍了新浪财经股票数据爬取技术,从静态网页解析、实时接口请求到异步爬取和数据存储,帮助你搭建了一个完整的金融数据采集流程。未来,可以结合深度学习模型进行行情预测,或者将数据接入量化交易系统,实现自动化投资。

2201_76125261的博客 2210

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

无需同步,即开即用!10分钟搭建一个在线二步验证器——2FAuth |谷歌验证器(Google Authenticator)替代品

这期我们来聊一聊二步验证。双重认证Two-factor authentication,缩写为2FA,又称为双重验证、双因子认证、双因素认证,也有叫两步验证2-Step Verification,是多重要素验证中的一个特例,使用两种不同的元素,基于时间随机生成一串验证码用于和服务器验证的技术,来确认用户的身份。(类似之前网易的将军令和银行的电子令牌)强烈建议每个人都用二步验证!

RRiddle的博客 8085

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

常用的实现方式是在用户登录成功后,生成一个随机的字符串Token,将此Token保存在用户浏览器的 cookie 中,同时将这个字符串保存在用户的数据库中。当用户再次访问时,如果 cookie 中的字符串和数据库中的字符串相同,则免登录验证通过。rememberClientToken是存储于cookie中的,当用户登出时不需要清空cookie中的rememberClientToken,以便下次登录跳过两步验证。为了安全,Token采用对称加密传输存储,同时参与校验的还有用户Id,以进一步验证数据一致性。

jevonsflash的专栏 2223

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块

创建方法IsTwoFactorAuthRequiredAsync,返回登录用户是否需要双因素认证,若未开启TwoFactorLogin.IsEnabled、用户未开启双因素认证,或没有添加验证提供者,则跳过双因素认证。双因素认证(Two-Factor Authentication,简称 2FA)是使用两个或多个因素的任意组合来验证用户身份,例如用户提供密码后,还要提供短消息发送的验证码,以证明用户确实拥有该手机。至此,双因素认证的后端逻辑已经完成,接下来我们将补充“记住”功能,实现一段时间内免验证。

jevonsflash的专栏 2275

Laravel 下实现 Google 2fa 验证

Laravel 下实现 Google 2fa 验证

吴家健ken的博客 1935

新建一个项目,如何使用abp用户登录系统

1、首先参考Framework.Web里的packages.config,把相关的包都安装好。 2、App_Start文件夹下的xxxModule.cs和Startup.cs拷过来,修改下命名空间。 3、Controllers里的Result文件夹、ControllerBase.cs、AccountController.cs拷过来,修改下命名空间。 4、在需要登录才能访问的cont...

weixin_30627341的博客 1818

如何使用2FA秘钥登录Facebook

1

Facebook_shop的博客 1万+

abp中多种登陆用户的设计

场景 在《学校管理系统》中,学生、家长、教师、教务都可能登陆,做一些属于他们自己的操作。这些用户需要的属性各不相同,比如学生有学号,而教师没有。 应用程序用户 在编码时,经常需要获取当前登陆用户的信息,这个当前登陆用户就是应用程序用户。asp.net提供了一整套方案来实现应用程序用户,包括身份验证、授权、asp.net identity等 应用程序用户与业务场景中的用户不同,应用程序用户只需要区别是谁,最简单情况只需要知道用户id,它不关心这个用户具体是教师还是学生或其它类型的用户。基于这个用户id还可以.

zhoumouren88的博客 1633

AbpVnext 扩展企业微信扫码登录(钉钉登陆、短信登陆、微信登陆等)Vue框架

abp vnext - ABP框架 - 开源Web应用程序框架!ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。

m0_72992974的博客 2424

c# +winform验证码生成并验证(通过创建公共类来实现)

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsAp...

weixin_34221276的博客 326

vue3类型uniapp调用signalr

uniapp连接signalr vue3 app

woflyoycm的博客 1586

2FA双因子认证之OTP算法

2FA双因子认证之OTP算法 概述 2 Factor Authentication简称2FA,双因子认证是一种安全密码验证方式。区别于传统的密码验证,由于传统的密码验证是由一组静态信息组成,如:字符、图像、手势等,很容易被获取,相对不安全。2FA是基于时间、历史长度、实物(信用卡、SMS手机、令牌、指纹)等自然变量结合一定的加密算法组合出一组动态密码,一般每60秒刷新一次。不容易被获取和破解,相对安全。 TOTP/HOTP作为其中的一种(实际是两种,不过其中一个是变种,这里当作一种)算法,目前已经用于

分享各种技术 2169
上一篇: [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
下一篇: 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证
林晓lx
林晓lx 2017年优快云移动跨平台大赛优秀奖获得者 2017年优快云移动跨平台大赛优秀奖获得者
博客等级 码龄15年 3761粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林晓lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值