Authing 知识库
🛠 开发资源🥂 集成案例🔭 常见问题🖥 控制台
3.0.0
3.0.0
  • 欢迎
  • Authing 概述
  • 快速开始
    • 注册 Authing 开发者账号
    • 第一个应用
    • 基础概念
    • 实现单点登录
    • 控制台概览
    • 部署模型和价格
    • 最佳开发实践
    • 我该如何选择 Authing 的技术
  • 进阶指南
    • 理解认证和授权
      • 用户名 - 密码认证
      • 邮箱 - 密码认证
      • 手机 - 验证码认证
      • JWT Token 释义及使用
    • 验证 Token
    • 配置用户权限
    • 迁移老数据进 Authing
    • 错误代码
  • 认证
    • 接入 OAuth 2.0
      • 创建 OAuth 应用
      • 使用 OAuth 授权
    • 接入 OpenID Connect
      • 创建 OIDC 应用
      • 使用 OIDC 授权
      • 理解 OIDC 流程
      • OIDC 常见问题
    • 接入 SAML
      • 创建 SAML Identity Provider 应用
      • 创建 SAML Service Provider 应用
      • 理解 SAML 流程
      • 同时使用 Authing 作为 SP 和 IdP
      • 使用 SAML Identity Provider
        • 在阿里云访问管理中使用
        • 在腾讯云访问管理中使用
        • 在 Auth0 中使用
      • 使用 SAML Service Provider
        • 与 Auth0 SAML IdP 对接
        • 与 SSOCircle SAML IdP 对接
    • 接入 LDAP
      • 配置 LDAP 服务
      • 使用 Authing 的 LDAP 用户目录
    • 接入 Active Directory
  • 社会化登录
    • 接入 Web 端社会化登录
      • GitHub 登录
      • 微信 PC 扫码登录
      • 微信 APP 内网页登录
      • 企业微信(第三方应用)网页授权登录
      • 企业微信(第三方应用)扫码登录
      • 企业微信(企业内部)扫码登录
      • 新浪微博登录
      • 钉钉登录
      • QQ 登录
      • 配置登录授权 Scope
    • 接入移动端社会化登录
      • 微信登录
      • 支付宝登录
    • 接入小程序登录
      • 小程序登录
        • 用户登录凭证(code)最佳实践
      • APP 拉起小程序登录
    • 打通微信账号体系
  • 扫码登录
    • 小程序扫码登录
      • 接入私有化小程序
    • APP 扫码登录
      • 快速接入
      • Web 端 SDK
      • 完整接口列表
      • 自定义配置项
      • 扫码登录原理
  • 移动应用登录
    • 移动应用 SSO
      • 自动检测登录
      • 唤起 App 登录
    • 移动应用身份提供商
  • 授权
    • Authorization 基础概念
      • 什么是基于角色的管理(RBAC)
      • 什么是基于属性的管理(ABAC)
      • 什么是零信任网络
    • Authorization at Authing
    • 接入 RBAC
    • 接入 ABAC
    • 接入组织机构管理
  • 扩展能力
    • 自定义认证流程(Pipeline)
      • 创建你的第一个 Pipeline 函数
      • Pipeline 函数开发指南
      • 应用场景
      • user 对象
      • context 对象
      • 使用环境变量
      • 可用的 Node Modules
      • 如何调试
      • Node SDK
      • GraphQL API
      • 常见问题
      • 私有化部署
    • 使用 Webhook
    • 自定义用户字段
  • 开发资源
    • 开发资源
    • API(GraphQL)
    • Guard for Web
      • 自定义 Guard 的 UI 样式
    • Guard for Mobile
      • Guard for React Native
    • Guard VS 自定义 UI
    • SDK for 单点登录
    • SDK for JavaScript
      • 查询用户权限
      • 绑定社会化登录
      • 自定义用户字段
      • 管理 MFA 口令
      • 自定义请求链接
    • SDK for Node.js
      • 权限控制
      • 查询用户权限
      • 组织机构管理
      • 老版权限控制(deprecated)
      • Pipeline 函数
      • 自定义用户字段
      • 绑定社会化登录
      • 管理 MFA 口令
      • 自定义请求连接
    • SDK for React Native
    • SDK for 微信小程序
    • SDK for Java
    • SDK for Objective-C
    • SDK for Python
    • SDK for Go
    • SDK for PHP
    • 函数计算(FaaS)
  • 通信
    • 邮件
    • SMS
  • MFA
    • 配置 MFA 安全口令
      • 使用 Microsoft Authenticator 添加 MFA 令牌
    • 接入 MFA
  • 安全
    • 配置 Web 安全域
    • 配置用户池密码强度
    • 配置密码加密函数
  • 其他
    • 常见问题
    • 集成案例
      • Authing 与 AWS 集成案例
      • 函数计算与 AaaS 集成案例
      • Odoo 集成案例
      • 社会化登录集成案例
    • 社交互联数据
    • 为 Authing 贡献 SDK
      • 了解 Authing 的模块
Powered by GitBook
On this page
  • 前期准备
  • 所需技能
  • 新建一个空白 html 文件用于编写 Authing 程序
  • 添加基本控件
  • 初始化 SDK
  • 创建一个用户
  • 开启指定用户的 MFA
  • 生成 MFA 令牌二维码
  • 处理用户登录逻辑
  • 完整代码
  • 运行方法

Was this helpful?

  1. MFA

接入 MFA

多因素身份验证(MFA)是一种安全系统,是为了验证一项操作合法性而实行多种身份验证。例如银行的 U 盾,异地登录要求手机短信验证。阅读本教程后,你可以基于 Authing 的 MFA 功能进行定制化开发。

Previous使用 Microsoft Authenticator 添加 MFA 令牌Next配置 Web 安全域

Last updated 5 years ago

Was this helpful?

前期准备

  1. 。

  2. 。

  3. 。

  4. 建议安装 http-server 用于快速启动 http 服务器来查看 html 文件。npm install -g http-server

所需技能

  1. 基础 HTML 知识

  2. 中级 Javascript 知识

新建一个空白 html 文件用于编写 Authing 程序

本教程只是为了演示,因此我们没选择高级框架,这可以让我们专注于 MFA 逻辑本身。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Authing MFA Example</title>
  </head>
  <body></body>
</html>

添加基本控件

为我们的 html 添加四个输入框和三个按钮。用于输入用户名、密码、验证码、MFA 口令等信息。我们使用 jquery 的插件来生成 MFA 令牌的二维码。

<div class="row">
  <label>用户名:<input id="username"/></label>
  <label>密码:<input id="password"/></label>
  <label>验证码:<input id="verify-code"/><img id="verify-img" style="vertical-align: bottom;"/></label>
</div>
<div id="mfa" style="visibility: hidden;" class="row">
  <label>MFA 口令:<input type="number" id="mfa-code"/></label>
</div>
<div class="row">
  <input type="button" value="登录" id="login" onclick="handleLogin()" />
  <input
    type="button"
    value="注册"
    id="register"
    onclick="handleRegister()"
  />
  <input
    type="button"
    value="开启 MFA"
    id="register"
    onclick="handleChangeMFA()"
  />
</div>
<div id="qrcode" class="row"></div>
<div id="qrcode-info" style="visibility: hidden;" class="row">
  请使用 MFA 令牌管理工具扫码添加令牌
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/authing-js-sdk"></script>

初始化 SDK

浏览器端初始化时需传入用户池 ID

  • userPoolId

<script>
const auth = new Authing({
	userPoolId: 'your_userpool_id',
});

authing.login({...}).then(info => {})
authing.register({...}).then(info => {})

</script>

创建一个用户

将此函数绑定到登录按钮的点击事件上,用随机信息注册一个用户。

// 使用随机信息注册一个用户
async function handleRegister() {
  let rand = Math.random()
    .toString(36)
    .slice(2);
  let res = await validAuth.register({
    email: rand + "@test.com",
    password: "123456"
  });
  alert(JSON.stringify(res));
  document.getElementById("username").value = res.email;
  document.getElementById("password").value = "123456";
  window.userId = res._id;
}

开启指定用户的 MFA

操作用户的 MFA 开启状态之前,必须要先获得用户的 token。可以通过 validAuth.login 函数以用户的身份登录,或者直接使用用户的 token 初始化。

// 开启用户的 MFA
async function handleChangeMFA() {
  let username = document.getElementById("username").value;
  let password = document.getElementById("password").value;
  let verifyCode = document.getElementById("verify-code").value;

  try {
    let res = await validAuth.login({
      email: username,
      password: password,
      verifyCode: verifyCode
    });
    // 或者使用用户的 token 初始化
    // authing.initUserClient('用户的 JWT token');
    let mfa = await validAuth.changeMFA({
      userId: res._id,
      userPoolId: "5c95905578fce5000166f853",
      enable: true
    });
    alert(JSON.stringify(mfa));
    jQuery("#qrcode").qrcode(
      `otpauth://totp/Authing:Test?secret=${mfa.shareKey}&period=30&digits=6&issuer=Authing`
    );
    document.getElementById("qrcode-info").style.visibility = "visible";
  } catch (err) {
    alert("失败消息:" + JSON.stringify(err));
  }
}

生成 MFA 令牌二维码

社区有许多可以生成二维码的库,这里使用了 jquery 的二维码插件生成 MFA 二维码。

jQuery("#qrcode").qrcode(
  `otpauth://totp/Authing:Test?secret=${mfa.shareKey}&period=30&digits=6&issuer=Authing`
);

处理用户登录逻辑

当调用 validAuth.login 函数进行登录时,如果检测到用户开启了 MFA 二次验证,而没有携带 MFA 口令,会抛出一个错误,错误代码为 1635。在错误处理函数中,携带 MFA 口令再次调用 validAuth.login 即可。

// 登录逻辑
async function handleLogin() {
  // validAuth.login({email: })
  let username = document.getElementById("username").value;
  let password = document.getElementById("password").value;
  let verifyCode = document.getElementById("verify-code").value;
  if (isMFAShow) {
    let MFACode = document.getElementById("mfa-code").value;
    try {
      let res = await validAuth.login({
        email: username,
        password: password,
        MFACode: MFACode,
        verifyCode: verifyCode
      });
      alert("成功消息:" + JSON.stringify(res));
    } catch (err) {
      alert("失败消息:" + JSON.stringify(err));
      if(err.message.code === 2000 || err.message.code === 2001 || err.message.code === 2006) {
        console.log(err.message.data.url)
        document.getElementById("verify-img").src = err.message.data.url
      }
    }
  } else {
    try {
      let res = await validAuth.login({
        email: username,
        password: password,
        verifyCode: verifyCode
      });
      alert("成功消息:" + JSON.stringify(res));
    } catch (err) {
      alert("失败消息:" + JSON.stringify(err));

      if (err.message.code === 1635) {
        showMFAInput();
      }
      if(err.message.code === 2000 || err.message.code === 2001 || err.message.code === 2006) {
        console.log(err.message.data.url)
        document.getElementById("verify-img").src = err.message.data.url
      }
    }
  }
}

完整代码

运行方法

双击打开 index.html 文件。

或在项目目录启动一个 http 服务器。

$ npm install -g http-server
$ http-server

然后访问 127.0.0.1:8080。

用户池 ID,可从 中。

Github:

mfa-demo
注册一个 Authing 账号
创建一个 OIDC 应用
Authing 控制台
获取
创建一个用户池