多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

这篇具有很好参考价值的文章主要介绍了多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能介绍

对用户表扩展手机号码字段,允许用户通过手机号码与验证码的方式进行认证,注册,重置密码以及更换手机号。
多因素身份认证 (MFA) 是保护企业 IT 资源访问安全的一种关键工具,也是零信任安全模型的核心组成。特别在远程办公以及数据泄露事件层出不穷的背景下,越来越多企业都开始考虑实施多因素身份认证策略。
根据近期一项对 IT 专业人员的调查,52.6%的中小型企业已经要求为所有应用程序和系统登录添加多因素身份认证。其中手机推送认证形式(无密码认证)的二次认证是保证良好用户体验的绝佳选择。
开源IDaaS方舟一账通ArkID系统内置手机验证码认证插件简单配置、马上可用,降低实施成本,提升应用集成效率。

普通用户:

在 “注册” 页面实现手机号码+验证码用户注册
在 “登录” 页面实现手机号码+验证码用户登录
在 “更改密码” 页面实现手机号码+验证码方式下密码更改
在 “我的 - 认证管理“ 中添加重置手机号码的功能

租户管理员

在”用户管理 - 用户列表“中编辑页面添加手机号码编辑功能

前置条件

需配合短信插件使用,系统已默认提供阿里云短信插件,如需查看配置方法请移步阿里云短信插件文档。

配置指南

01 插件租赁
经由左侧菜单栏依次进入【租户管理】->【插件管理】,在插件租赁页面中找到手机验证码认证因素插件卡片,点击租赁
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
02 认证因素配置
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
** 03 登录界面**
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
** 04 注册界面**
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

** 05 密码修改界面**
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
** 06 更换手机号码界面**

由用户头像菜单进入【认证管理】界面,选择更改手机号码标签页
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
实现思路#
普通用户:手机号码+验证码用户注册/登录/重置密码:
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
普通用户:重置手机号码:
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
管理员用户: 更换用户手机号码
多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

抽象方法实现

  • load
  • authenticate
  • register
  • reset_password
  • create_login_page
  • create_register_page
  • create_password_page
  • create_other_page
  • create_auth_manage_page
  • check_auth_data
  • f - ix_login_page

代码

extension_root.com_longgui_auth_factor_mobile.MobileAuthFactorExtension (AuthFactorExtension)

手机短信验证码认证因素插件

Source code in
extension_root/com_longgui_auth_factor_mobile/init.py文章来源地址https://www.toymoban.com/news/detail-488616.html

class MobileAuthFactorExtension(AuthFactorExtension):
    """手机短信验证码认证因素插件
    """
    def load(self):
        """加载插件
        """
        super().load()

        self.create_extension_config_schema()

        self.register_extend_field(UserMobile, "mobile")
        from api.v1.schema.auth import AuthIn
        from api.v1.schema.user import UserCreateIn,UserItemOut,UserUpdateIn,UserListItemOut
        from api.v1.schema.mine import ProfileSchemaOut
        self.register_extend_api(
            AuthIn,
            UserCreateIn, 
            UserItemOut, 
            UserUpdateIn, 
            UserListItemOut,
            mobile=(Optional[str],Field(title=_("电话号码"))),
            # areacode=(str,Field(title=_("区号")))
        )
        self.register_extend_api(
            ProfileSchemaOut, 
            mobile=(Optional[str],Field(readonly=True))
        )

        # 注册发送短信接口
        self.url_send_sms_code = self.register_api(
            '/config/{config_id}/send_sms_code/',
            'POST',
            self.send_sms_code,
            tenant_path=True,
            auth=None,
            response=SendSMSCodeOut,
        )
        print(self.url_send_sms_code)

    def authenticate(self, event, **kwargs):
        """ 认证

        通过手机号码查找用户并校验短信验证码

        Args:
            event (Event): 事件

        """
        tenant = event.tenant
        request = event.request
        data = request.POST or json.load(request.body)

        mobile = data.get('mobile')
        sms_code = data.get('sms_code')

        user = User.expand_objects.filter(tenant=tenant,mobile=mobile)
        if len(user) > 1:
            logger.error(f'{mobile}在数据库中匹配到多个用户')
            return self.auth_failed(event, data=self.error(ErrorCode.CONTACT_MANAGER))
        if user:
            user = user[0]
            if check_sms_code(mobile, sms_code):
                user = User.active_objects.get(id=user.get("id"))
                return self.auth_success(user,event)
            else:
                msg = ErrorCode.SMS_CODE_MISMATCH
        else:
            msg = ErrorCode.MOBILE_NOT_EXISTS_ERROR
        return self.auth_failed(event, data=self.error(msg))

    @transaction.atomic()
    def register(self, event, **kwargs):
        """ 注册用户

        Args:
            event (Event): 事件
        """
        tenant = event.tenant
        request = event.request
        data = request.POST or json.load(request.body)

        mobile = data.get('mobile')
        sms_code = data.get('sms_code')
        username = data.get('username')

        config = self.get_current_config(event)
        ret, message = self.check_mobile_exists(mobile, tenant)
        if not ret:
            return self.error(message)

        if not check_sms_code(mobile, sms_code):
            return self.error(ErrorCode.SMS_CODE_MISMATCH)

        ret, message = self.check_username_exists(username, tenant)
        if not ret:
            return self.error(message)

        user = User(tenant=tenant)

        user.mobile = mobile
        user.username = username

        user.save()
        tenant.users.add(user)
        tenant.save()

        return user

    def reset_password(self, event, **kwargs):
        """ 重置密码

        Args:
            event (Event): 事件
        """
        tenant = event.tenant
        request = event.request
        data = request.POST or json.load(request.body)

        mobile = data.get('mobile')
        sms_code = data.get('sms_code')

        password = data.get('password')
        checkpassword = data.get('checkpassword')

        if password != checkpassword:
            return self.error(ErrorCode.PASSWORD_IS_INCONSISTENT)

        if not check_sms_code(mobile, sms_code):
            return self.error(ErrorCode.SMS_CODE_MISMATCH)

        user = User.expand_objects.filter(tenant=tenant,mobile=mobile)

        if len(user) > 1:
            logger.error(f'{mobile}在数据库中匹配到多个用户')
            return self.error(ErrorCode.CONTACT_MANAGER)
        if user:
            user = user[0]
            user = User.active_objects.get(id=user.get("id"))
            user.password = make_password(password)
            user.save()
            return self.success()

        return self.error(ErrorCode.MOBILE_NOT_EXISTS_ERROR)

    def create_login_page(self, event, config, config_data):
        """ 生成手机验证码登录页面Schema描述

        Args:
            event (Event): 事件
            config (TenantExtensionConfig): 插件运行时配置
        """

        items = [
            {
                "type": "text",
                "name":"mobile",
                "placeholder": "手机号码",
                "append": {
                    "title": "发送验证码",
                    "http": {
                        "url": self.url_send_sms_code,
                        "method": "post",
                        "params": {
                            "mobile": "mobile",
                            "areacode": "86",
                        },
                    },
                    "delay": 60
                }
            },
            {
                "type": "text",
                "name":"sms_code",
                "placeholder": "验证码",
            }
        ]
        self.add_page_form(config, self.LOGIN, "手机验证码登录", items, config_data)

    def create_register_page(self, event, config, config_data):
        """生成手机验证码用户注册页面Schema描述

        因本插件提供重置密码功能,此处需用户指定账号用户名

        Args:
            event (Event): 事件
            config (TenantExtensionConfig): 插件运行时配置
        """
        items = [
            {
                "type": "text",
                "name": "username",
                "placeholder": "用户名"
            },
            {
                "type": "text",
                "name":"mobile",
                "placeholder": "手机号码",
                "append": {
                    "title": "发送验证码",
                    "http": {
                        "url": self.url_send_sms_code,
                        "method": "post",
                        "params": {
                            "mobile": "mobile",
                            "areacode": "86",
                        },
                    },
                    "delay": 60
                }
            },
            {
                "type": "text",
                "name":"sms_code",
                "placeholder": "验证码"
            }
        ]
        self.add_page_form(config, self.REGISTER, "手机验证码注册", items, config_data)

    def create_password_page(self, event, config, config_data):
        """生成重置密码页面Schema描述

        通过手机验证码重置密码时需提供手机号码以及对应验证码,同时此处添加新密码确认机制

        注意:重置密码功能需要启用用户名密码认证插件以提供完整支持

        Args:
            event (Event): 事件
            config (TenantExtensionConfig): 插件运行时配置
        """
        items = [
            {
                "type": "text",
                "name":"mobile",
                "placeholder": "手机号码",
                "append": {
                    "title": "发送验证码",
                    "http": {
                        "url": self.url_send_sms_code,
                        "method": "post",
                        "params": {
                            "mobile": "mobile",
                            "areacode": "86",
                        },
                    },
                }
            },
            {
                "type": "text",
                "name":"sms_code",
                "placeholder": "验证码"
            },
            {
                "type": "password",
                "name":"password",
                "placeholder": "密码"
            },
            {
                "type": "password",
                "name":"checkpassword",
                "placeholder": "密码确认"
            }
        ]
        self.add_page_form(config, self.RESET_PASSWORD, "手机验证码重置密码", items, config_data)

    def create_other_page(self, event, config, config_data):
        """创建其他页面(本插件无相关页面)

        Args:
            event (Event): 事件
            config (TenantExtensionConfig): 插件运行时配置
        """
        pass

    def check_mobile_exists(self, mobile, tenant):
        """检查电话号码是否已存在

        Args:
            mobile (str): 手机号
            tenant (Tenant): 租户

        Returns:
            (bool,ErrorCode): mobile是否存在以及对应错误
        """
        if not mobile:
            return False, ErrorCode.MOBILE_EMPTY

        if User.expand_objects.filter(tenant=tenant,mobile=mobile).count():
            return False, ErrorCode.MOBILE_EXISTS_ERROR
        return True, None

    def check_username_exists(self,username,tenant):
        """检查用户名是否已存在

        Args:
            username (str): 用户名
            tenant (Tenant): 租户

        Returns:
            (bool,ErrorCod

到了这里,关于多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web应用程序的身份验证:Session认证、Token认证

    一、Web应用程序的身份验证 1、Session认证 ① 用户向服务器发送用户名和密码 ② 服务器验证通过后,在当前对话(session)里面保存相关数据,如用户角色,登陆时间等 ③ 服务器向用户返回一个session_id,写入用户的Cookie ④ 用户随后的每一次请求,都会通过Cookie,将session_

    2024年02月03日
    浏览(42)
  • 【GitHub】2FA认证(双重身份验证)

    🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长! 中国+86手机号验证不可行,笔者使用 TOTP 应用程序配置双2FA(双因素身份验证)。 官方列举了这几种方式,看自己方便使用哪种 如果登录GitHu

    2024年04月25日
    浏览(50)
  • 安全开发:身份认证方案之 Google 身份验证器和基于时间的一次性密码 TOTP 算法

    参考资料在文末注明,如本文有错漏欢迎评论区指出👏 目前很多应用都逐步采用了双因子认证或者说MFA认证方案,因此本文介绍一下背后的机制和 TOTP算法 原理。使用TOTP算法,只要满足两个条件:1)基于相同的密钥;2)时钟同步;只需要事先约定好密钥,TOTP算法就可以保

    2024年02月04日
    浏览(58)
  • 实施PCIDSS认证:确保您的身份验证和授权在安全环境中运行

    作者:禅与计算机程序设计艺术 “Payment Card Industry Data Security Standard”(PCI DSS)是一个美国信息安全标准,是20世纪90年代末由美国国家信用卡行业组织(National Institute of Standards and Technology,NIST)提出的安全标准。它是防止信用卡交易被不法侵入者窃取、篡改或泄露个人信息

    2024年02月05日
    浏览(46)
  • Spring Security 多因素认证(MFA)

    Spring Security 系列文章开始更新了!工程地址为github.com/ReLive27/sp…,如果你对此系列感谢趣,可以点击关注作者获取最新文章发布信息。 多因素身份验证是一种提高产品安全性的方法,它通过要求用户提供除用户名和密码之外的第二种形式的身份验证来增加额外的安全层。

    2024年02月08日
    浏览(36)
  • Nginx进阶 配置-Nginx auth_basic 身份认证

    在公司前期投入研发时,尤其针对于ZF的客户,往往是很多需求含糊不清,可项目的里程碑节点已是板上定钉。在这种情况下,需求组应和研发组协同推敲,不断的制定计划、出demo,拿着我们推测出的构建想法及原型去征求客户的意见。 对于大屏、驾驶舱等可以前端先行的项

    2024年02月12日
    浏览(35)
  • Windows下安装单机Kafka环境及配置SASL身份认证

    zookeeper和kafka都是java开发的,所以安装前先安装1.8版本以上的jdk,并设置环境变量 JAVA_HOME=d:envJavajdk1.8.0_14 1.1 Apache ZooKeeper点击下载地址 Apache ZooKeeper,下载最新版本zookeeper压缩包,解压到本地 1.2 来到 conf文件夹下,复制一份 zoo_sample.cfg ,改名为 zoo.cfg 1.3 在安装目录下新

    2024年02月01日
    浏览(38)
  • npm 配置双因素身份验证

    目录 1、关于双因素身份验证 2、NPM上的双因素身份验证 2.1 授权和写入 2.2 仅限授权 3、先决条件 4、从网站配置2FA 4.1 启用2FA 4.2 为写入禁用2FA 4.3 禁用2FA 5、从命令行配置2FA 5.1 从命令行启用2FA 5.2 从命令行发送一次性密码 5.3 从命令行删除2FA 6、配置帐户恢复选项 今天收到一

    2024年02月07日
    浏览(38)
  • 统一身份认证,构建数字时代的安全壁垒——统一身份认证介绍、原理和实现方法

    随着数字化时代的来临,个人和机构在互联网上的活动越来越频繁,对于身份认证的需求也愈发迫切。为了有效应对身份欺诈、数据泄露等问题,统一身份认证(Unified Identity Authentication)应运而生。 在本文博主将介绍统一身份认证的概念、原理以及其具体的实现方案。 统一

    2024年02月03日
    浏览(43)
  • 身份认证——802.1x认证和MAC认证讲解

    目录 802.1x基础 EAP(Extensible Authentication Protocol)可扩展认证协议 EAPoL(EAP over LAN)局域网可扩展认证协议 802.1x体系架构 受控端口的受控方式 802.1x认证 802.1x认证触发方式 客户端退出认证 802.1x认证方式 MAC认证 802.1x认证又称为EAPOE(Extensible Authentication Protocol Over Ethernet)认证

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包