Skip to content
On this page

custom-mfa

usage

in CIPS apps for multi factor authentication

Import component

in HTML header in structure.vm velocity template

html
<script type="module" crossorigin src="/scripts/path/to/mfa.js"></script>

Place component

in velocity templates profile.vm and mfa_activate_login.vm

html
<custom-mfa></custom-mfa>

Passing data to component

Some sessions keys are required for optional/mandatory mfa

html
#set( $mfalogin = ${session.getAttribute($constants.get('SESSION_KEY_MULTIFACTOR_AUTHENTICATION_ACTIVATION_REQUIRED'))} )
  <div id="islogin" style="display: none;">$mfalogin</div>
html
#set( $mfalogin = ${session.getAttribute($constants.get('SESSION_KEY_MULTIFACTOR_AUTHENTICATION_ACTIVATION_AFTER_LOGIN'))} )
  <div id="islogin" style="display: none;">$mfalogin</div>

We can use helper function to pass all the attributes

js
function setAttributes(el, attrs) {
    for (var key in attrs) {
      const attr =
        typeof attrs[key] !== "string"
          ? JSON.stringify(attrs[key])
          : attrs[key];
      el.setAttribute(key, attr);
    }
  }

Passing data in velocity templates examples

js
const mfa = document.querySelector('custom-mfa');

  const mfaProps = {
    translations: {
      #foreach($resource in ${messages.getResourcesWithPrefix('cips.mfa')})
        '$!{resource.getKey()': '$!{resource.getValue().replace("'", "")}',
      #end
    },
    "primary-color": getComputedStyle(document.querySelector('.site-title')).color,
    font: getComputedStyle(document.querySelector('.site-title')).fontFamily,
    "logo-url": getComputedStyle(document.querySelector('.customer-logo-frame > a')).backgroundImage,
    "mfa-status-url": "${link.getAction('/myprofile/mfa/checkStatus')}",
    "mfa-generate-qr-code-url": "${link.getAction('/myprofile/mfa/generateQrCode')}",
    "mfa-check-verification-code-url": "${link.getAction('/myprofile/mfa/checkVerificationCode')}",
    "mfa-activate-url": "${link.getAction('/myprofile/mfa/activate')}",
    "mfa-download-backup-codes-url": "${link.getAction('/myprofile/mfa/downloadBackupCodes')}",
    "mfa-deactivate-url": "${link.getAction('/myprofile/mfa/deactivate')}",
    "mfa-generate-new-backup-codes-url": "${link.getAction('/myprofile/mfa/generateNewBackupCodes')}",
    "from-mfa-hint": document.querySelector('#islogin').innerText
  };

  setAttributes(mfa, mfaProps);
js
const mfa = document.querySelector("custom-mfa");

  const mfaProps = {
    translations: {
      #foreach($resource in ${messages.getResourcesWithPrefix('cips.mfa')})
        '$!{resource.getKey()': '$!{resource.getValue().replace("'", "")}',
      #end
    },
    "primary-color": getComputedStyle(document.querySelector('.site-title')).color,
    font: getComputedStyle(document.querySelector('.site-title')).fontFamily,
    "logo-url": getComputedStyle(document.querySelector('.customer-logo-frame > a')).backgroundImage,
    "mfa-status-url": "${link.getAction('/myprofile/mfa/checkStatus')}",
    "mfa-generate-qr-code-url": "${link.getAction('/login/mfa/generateQrCode')}",
    "mfa-check-verification-code-url": "${link.getAction('/login/mfa/checkVerificationCode')}",
    "mfa-activate-url": "${link.getAction('/login/mfa/activate')}",
    "mfa-download-backup-codes-url": "${link.getAction('/login/mfa/downloadBackupCodes')}",
    "mfa-deactivate-url": "${link.getAction('/myprofile/mfa/deactivate')}",
    "mfa-generate-new-backup-codes-url": "${link.getAction('/myprofile/mfa/generateNewBackupCodes')}",
    "from-mfa-login": document.querySelector('#islogin').innerText
  };

  setAttributes(mfa, mfaProps);

Props

Translations are recived from velocity action:

translations

  • Type: String

Styles are received from site elements:

primaryColor

  • Type: String
  • Default: "#000"

font

  • Type: String
  • Default: "'Open Sans', sans-serif"

logoUrl

  • Type: String
  • Default: ""

Actions url's are received from velocity actions:

mfaStatusUrl

  • Type: String
  • Default: ""

mfaGenerateQrCodeUrl

  • Type: String
  • Default: ""

mfaCheckVerificationCodeUrl

  • Type: String
  • Default: ""

mfaActivateUrl

  • Type: String
  • Default: ""

mfaDownloadBackupCodesUrl

  • Type: String
  • Default: ""

mfaDeactivateUrl

  • Type: String
  • Default: ""

mfaGenerateNewBackupCodesUrl

  • Type: String
  • Default: ""

Session keys if user comes from mfa login/hint page:

fromMfaHint

  • Type: String
  • Default: ""

fromMfaLogin

  • Type: String
  • Default: ""

Deployment

  • build app
  • upload file mfa.js from dist folder to Doocroot-Explorer -> scripts/path/for/app

cadooz