{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":["admonition","tabs"]},"redocly_category":"Guides","product":"Identity Management","type":"markdown"},"seo":{"title":"Login with push (web to mobile approve)","description":"Everything about Mosaic Journeys, SDKs, and APIs","siteUrl":"https://developer.transmitsecurity.com/"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"login-with-push-web-to-mobile-approve","__idx":0},"children":["Login with push (web to mobile approve)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Mosaic enables a \"web to mobile\" authentication and approval flow that uses a mobile device to authenticate into a web app. Instead of starting and completing the process in a web browser, the user receives a push notification on their preregistered iOS or Android device. From the push notification, they're prompted to validate a one-time passcode (OTP) to authenticate and approve the action in the mobile app. After completing authentication, the user can seamlessly return to the web app and continue their operations."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This approach enhances security by introducing a second factor (the OTP) that validates the user's identity on a trusted mobile device, making it a preferred method for securing sensitive operations, such as logins, approving transactions, or authorizing account changes (e.g., updating a mailing address)."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide explains how to implement authentication with push notifications using ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/journeys_intro"},"children":["Journeys"]}," and Orchestration SDKs. To learn more about SDKs integration, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_web"},"children":["Orchestration quickstarts"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":1},"children":["How it works"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a user requests to log in to the web app, the web app invokes a journey that passes this request to Mosaic (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-7-implement-web-to-mobile-request"},"children":["Step 7"]},"). In response, Mosaic sends a push notification to the preregistered mobile device (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-4-implement-mobile-app-registration"},"children":["Step 4"]},") which triggers the mobile journey (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-5-implement-mobile-app-approval"},"children":["Step 5"]},"). The user then enters the OTP displayed on the web into their mobile device, and once the code is successfully validated, the flow completes and the user is logged into the web app."]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"sequenceDiagram\n  participant U as User\n  participant W as Web app\n  participant WIDO as Web Orchestration SDK\n  participant M as Mosaic\n  participant MIDO as Mob. Orchestration SDK\n  participant B as Mob. Auth. SDK\n  participant Mob as Mobile app\nU -->> W: login\nW ->> WIDO: startJourney()\nnote over W, M: Web login journey\nM ->> Mob: push notification\npar\nW -->> W: (Spinner) Waiting for mobile app\nW -->> WIDO: Polling\nand\nM ->> W: Display OTP code\nMob -->> Mob: Parse notification\nMob ->> MIDO: startMobileApproveJourney() with params\nnote over Mob, M: Mobile approval journey\nU ->> Mob: Enter OTP\nMob ->> MIDO: submitClientResponse() with OTP\nM -->> M: Validate OTP\nend\nnote over W, M: Web login journey complete (access token)\nW -->> U: logged in\n","diagramHtml":"<svg id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"max-width: 1546px;\" viewBox=\"-50 -10 1546 1041\" role=\"graphics-document document\" aria-roledescription=\"sequence\"><style>\n    #diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 foreignObject {\n      overflow: visible;\n    }\n  </style><g><rect x=\"1285\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"Mob\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"1360\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1360\" dy=\"0\">Mobile app</tspan></text></g><g><rect x=\"1085\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"B\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"1160\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1160\" dy=\"0\">Mob. Auth. SDK</tspan></text></g><g><rect x=\"841\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"194\" height=\"65\" name=\"MIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"938\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"938\" dy=\"0\">Mob. Orchestration SDK</tspan></text></g><g><rect x=\"641\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"M\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"716\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"716\" dy=\"0\">Mosaic</tspan></text></g><g><rect x=\"400\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"191\" height=\"65\" name=\"WIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"495.5\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"495.5\" dy=\"0\">Web Orchestration SDK</tspan></text></g><g><rect x=\"200\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"W\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"275\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"275\" dy=\"0\">Web app</tspan></text></g><g><rect x=\"0\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"U\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"75\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">User</tspan></text></g><g><line id=\"actor6\" x1=\"1360\" y1=\"65\" x2=\"1360\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"Mob\" data-et=\"life-line\" data-id=\"Mob\"></line><g id=\"root-6\" data-et=\"participant\" data-type=\"participant\" data-id=\"Mob\"><rect x=\"1285\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"Mob\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"1360\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1360\" dy=\"0\">Mobile app</tspan></text></g></g><g><line id=\"actor5\" x1=\"1160\" y1=\"65\" x2=\"1160\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"B\" data-et=\"life-line\" data-id=\"B\"></line><g id=\"root-5\" data-et=\"participant\" data-type=\"participant\" data-id=\"B\"><rect x=\"1085\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"B\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"1160\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1160\" dy=\"0\">Mob. Auth. SDK</tspan></text></g></g><g><line id=\"actor4\" x1=\"938\" y1=\"65\" x2=\"938\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"MIDO\" data-et=\"life-line\" data-id=\"MIDO\"></line><g id=\"root-4\" data-et=\"participant\" data-type=\"participant\" data-id=\"MIDO\"><rect x=\"841\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"194\" height=\"65\" name=\"MIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"938\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"938\" dy=\"0\">Mob. Orchestration SDK</tspan></text></g></g><g><line id=\"actor3\" x1=\"716\" y1=\"65\" x2=\"716\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"M\" data-et=\"life-line\" data-id=\"M\"></line><g id=\"root-3\" data-et=\"participant\" data-type=\"participant\" data-id=\"M\"><rect x=\"641\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"M\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"716\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"716\" dy=\"0\">Mosaic</tspan></text></g></g><g><line id=\"actor2\" x1=\"495.5\" y1=\"65\" x2=\"495.5\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"WIDO\" data-et=\"life-line\" data-id=\"WIDO\"></line><g id=\"root-2\" data-et=\"participant\" data-type=\"participant\" data-id=\"WIDO\"><rect x=\"400\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"191\" height=\"65\" name=\"WIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"495.5\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"495.5\" dy=\"0\">Web Orchestration SDK</tspan></text></g></g><g><line id=\"actor1\" x1=\"275\" y1=\"65\" x2=\"275\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"W\" data-et=\"life-line\" data-id=\"W\"></line><g id=\"root-1\" data-et=\"participant\" data-type=\"participant\" data-id=\"W\"><rect x=\"200\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"W\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"275\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"275\" dy=\"0\">Web app</tspan></text></g></g><g><line id=\"actor0\" x1=\"75\" y1=\"65\" x2=\"75\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"U\" data-et=\"life-line\" data-id=\"U\"></line><g id=\"root-0\" data-et=\"participant\" data-type=\"participant\" data-id=\"U\"><rect x=\"0\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"U\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"75\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">User</tspan></text></g></g><style>#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .error-icon{fill:#552222;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .error-text{fill:#552222;stroke:#552222;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-thickness-normal{stroke-width:1px;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-thickness-thick{stroke-width:3.5px;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-pattern-solid{stroke-dasharray:0;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .marker{fill:#333333;stroke:#333333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .marker.cross{stroke:#333333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 p{margin:0;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .actor{stroke:#9370DB;fill:#ECECFF;stroke-width:1;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 rect.actor.outer-path[data-look=\"neo\"]{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 rect.note[data-look=\"neo\"]{stroke:#aaaa33;fill:#fff5ad;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 text.actor&gt;tspan{fill:black;stroke:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .actor-line{stroke:#9370DB;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [id$=\"-arrowhead\"] path{fill:#333;stroke:#333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .sequenceNumber{fill:white;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [id$=\"-sequencenumber\"]{fill:#333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [id$=\"-crosshead\"] path{fill:#333;stroke:#333;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .messageText{fill:#333;stroke:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .labelBox{stroke:#9370DB;fill:#ECECFF;filter:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .labelText,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .labelText&gt;tspan{fill:black;stroke:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .loopText,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .loopText&gt;tspan{fill:black;stroke:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .sectionTitle,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .sectionTitle&gt;tspan{fill:black;stroke:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#9370DB;fill:#9370DB;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .note{stroke:#aaaa33;fill:#fff5ad;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .noteText,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .noteText&gt;tspan{fill:black;stroke:none;font-weight:normal;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .activation0{fill:#f4f4f4;stroke:#666;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .activation1{fill:#f4f4f4;stroke:#666;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .activation2{fill:#f4f4f4;stroke:#666;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .actorPopupMenu{position:absolute;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .actor-man circle,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 line{fill:#ECECFF;stroke-width:2px;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 g rect.rect{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));stroke:#9370DB;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 .node .neo-node{stroke:#9370DB;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node rect,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].cluster rect,#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g></g><defs><symbol id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-computer\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z\"></path></symbol></defs><defs><symbol id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-database\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path transform=\"scale(.5)\" d=\"M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z\"></path></symbol></defs><defs><symbol id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-clock\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z\"></path></symbol></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead\" refX=\"7.9\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M -1 0 L 10 5 L 0 10 z\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-crosshead\" markerWidth=\"15\" markerHeight=\"8\" orient=\"auto\" refX=\"4\" refY=\"4.5\"><path fill=\"none\" stroke=\"#000000\" stroke-width=\"1pt\" d=\"M 1,2 L 6,7 M 6,2 L 1,7\" style=\"stroke-dasharray: 0, 0;\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-filled-head\" refX=\"15.5\" refY=\"7\" markerWidth=\"20\" markerHeight=\"28\" orient=\"auto\"><path d=\"M 18,7 L9,13 L14,7 L9,1 Z\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-sequencenumber\" refX=\"15\" refY=\"15\" markerWidth=\"60\" markerHeight=\"40\" orient=\"auto\"><circle cx=\"15\" cy=\"15\" r=\"6\"></circle></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-solidTopArrowHead\" refX=\"7.9\" refY=\"7.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 8 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-solidBottomArrowHead\" refX=\"7.9\" refY=\"0.75\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 0 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-stickTopArrowHead\" refX=\"7.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 7 7\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><defs><marker id=\"diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-stickBottomArrowHead\" refX=\"7.5\" refY=\"0\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 7 L 7 0\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><g data-et=\"note\" data-id=\"i2\"><rect x=\"250\" y=\"167\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"491\" height=\"38\" class=\"note\"></rect><text x=\"496\" y=\"172\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"496\">Web login journey</tspan></text></g><g data-et=\"note\" data-id=\"i11\"><rect x=\"691\" y=\"599\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"694\" height=\"38\" class=\"note\"></rect><text x=\"1038\" y=\"604\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"1038\">Mobile approval journey</tspan></text></g><g data-et=\"control-structure\" data-id=\"i15\"><line x1=\"64\" y1=\"261\" x2=\"1446\" y2=\"261\" class=\"loopLine\"></line><line x1=\"1446\" y1=\"261\" x2=\"1446\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"841\" x2=\"1446\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"261\" x2=\"64\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"413\" x2=\"1446\" y2=\"413\" class=\"loopLine\" style=\"stroke-dasharray: 3, 3;\"></line><polygon points=\"64,261 114,261 114,274 105.6,281 64,281\" class=\"labelBox\"></polygon><text x=\"89\" y=\"274\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"labelText\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">par</text><text x=\"780\" y=\"279\" text-anchor=\"middle\" class=\"loopText\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"780\">​</tspan></text></g><g data-et=\"note\" data-id=\"i16\"><rect x=\"250\" y=\"851\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"491\" height=\"38\" class=\"note\"></rect><text x=\"496\" y=\"856\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"496\">Web login journey complete (access token)</tspan></text></g><text x=\"174\" y=\"80\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">login</text><line x1=\"76\" y1=\"111\" x2=\"271\" y2=\"111\" class=\"messageLine1\" data-et=\"message\" data-id=\"i0\" data-from=\"U\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"384\" y=\"126\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">startJourney()</text><line x1=\"276\" y1=\"157\" x2=\"491.5\" y2=\"157\" class=\"messageLine0\" data-et=\"message\" data-id=\"i1\" data-from=\"W\" data-to=\"WIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"1037\" y=\"220\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">push notification</text><line x1=\"717\" y1=\"251\" x2=\"1356\" y2=\"251\" class=\"messageLine0\" data-et=\"message\" data-id=\"i3\" data-from=\"M\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"276\" y=\"291\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">(Spinner) Waiting for mobile app</text><path d=\"M 276,322 C 336,312 336,352 276,342\" class=\"messageLine1\" data-et=\"message\" data-id=\"i5\" data-from=\"W\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"384\" y=\"367\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Polling</text><line x1=\"276\" y1=\"398\" x2=\"491.5\" y2=\"398\" class=\"messageLine1\" data-et=\"message\" data-id=\"i6\" data-from=\"W\" data-to=\"WIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"497\" y=\"438\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Display OTP code</text><line x1=\"715\" y1=\"469\" x2=\"279\" y2=\"469\" class=\"messageLine0\" data-et=\"message\" data-id=\"i8\" data-from=\"M\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"1361\" y=\"484\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Parse notification</text><path d=\"M 1361,513 C 1421,503 1421,543 1361,533\" class=\"messageLine1\" data-et=\"message\" data-id=\"i9\" data-from=\"Mob\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"1151\" y=\"558\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">startMobileApproveJourney() with params</text><line x1=\"1359\" y1=\"589\" x2=\"942\" y2=\"589\" class=\"messageLine0\" data-et=\"message\" data-id=\"i10\" data-from=\"Mob\" data-to=\"MIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"716\" y=\"652\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Enter OTP</text><line x1=\"76\" y1=\"681\" x2=\"1356\" y2=\"681\" class=\"messageLine0\" data-et=\"message\" data-id=\"i12\" data-from=\"U\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"1151\" y=\"696\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">submitClientResponse() with OTP</text><line x1=\"1359\" y1=\"727\" x2=\"942\" y2=\"727\" class=\"messageLine0\" data-et=\"message\" data-id=\"i13\" data-from=\"Mob\" data-to=\"MIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"fill: none;\"></line><text x=\"717\" y=\"742\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Validate OTP</text><path d=\"M 717,771 C 777,761 777,801 717,791\" class=\"messageLine1\" data-et=\"message\" data-id=\"i14\" data-from=\"M\" data-to=\"M\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"177\" y=\"904\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">logged in</text><line x1=\"274\" y1=\"935\" x2=\"79\" y2=\"935\" class=\"messageLine1\" data-et=\"message\" data-id=\"i17\" data-from=\"W\" data-to=\"U\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-0fc796b3e78845ec1b56b1ab219e0009f627f30727c2561fab5e75f7ecd76f34-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line></svg>","diagramHtmlDark":"<svg id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"max-width: 1546px;\" viewBox=\"-50 -10 1546 1041\" role=\"graphics-document document\" aria-roledescription=\"sequence\"><style>\n    #diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 foreignObject {\n      overflow: visible;\n    }\n  </style><g><rect x=\"1285\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"Mob\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"1360\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1360\" dy=\"0\">Mobile app</tspan></text></g><g><rect x=\"1085\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"B\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"1160\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1160\" dy=\"0\">Mob. Auth. SDK</tspan></text></g><g><rect x=\"841\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"194\" height=\"65\" name=\"MIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"938\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"938\" dy=\"0\">Mob. Orchestration SDK</tspan></text></g><g><rect x=\"641\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"M\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"716\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"716\" dy=\"0\">Mosaic</tspan></text></g><g><rect x=\"400\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"191\" height=\"65\" name=\"WIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"495.5\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"495.5\" dy=\"0\">Web Orchestration SDK</tspan></text></g><g><rect x=\"200\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"W\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"275\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"275\" dy=\"0\">Web app</tspan></text></g><g><rect x=\"0\" y=\"955\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"U\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"75\" y=\"987.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">User</tspan></text></g><g><line id=\"actor6\" x1=\"1360\" y1=\"65\" x2=\"1360\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"Mob\" data-et=\"life-line\" data-id=\"Mob\"></line><g id=\"root-6\" data-et=\"participant\" data-type=\"participant\" data-id=\"Mob\"><rect x=\"1285\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"Mob\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"1360\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1360\" dy=\"0\">Mobile app</tspan></text></g></g><g><line id=\"actor5\" x1=\"1160\" y1=\"65\" x2=\"1160\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"B\" data-et=\"life-line\" data-id=\"B\"></line><g id=\"root-5\" data-et=\"participant\" data-type=\"participant\" data-id=\"B\"><rect x=\"1085\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"B\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"1160\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"1160\" dy=\"0\">Mob. Auth. SDK</tspan></text></g></g><g><line id=\"actor4\" x1=\"938\" y1=\"65\" x2=\"938\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"MIDO\" data-et=\"life-line\" data-id=\"MIDO\"></line><g id=\"root-4\" data-et=\"participant\" data-type=\"participant\" data-id=\"MIDO\"><rect x=\"841\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"194\" height=\"65\" name=\"MIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"938\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"938\" dy=\"0\">Mob. Orchestration SDK</tspan></text></g></g><g><line id=\"actor3\" x1=\"716\" y1=\"65\" x2=\"716\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"M\" data-et=\"life-line\" data-id=\"M\"></line><g id=\"root-3\" data-et=\"participant\" data-type=\"participant\" data-id=\"M\"><rect x=\"641\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"M\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"716\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"716\" dy=\"0\">Mosaic</tspan></text></g></g><g><line id=\"actor2\" x1=\"495.5\" y1=\"65\" x2=\"495.5\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"WIDO\" data-et=\"life-line\" data-id=\"WIDO\"></line><g id=\"root-2\" data-et=\"participant\" data-type=\"participant\" data-id=\"WIDO\"><rect x=\"400\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"191\" height=\"65\" name=\"WIDO\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"495.5\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"495.5\" dy=\"0\">Web Orchestration SDK</tspan></text></g></g><g><line id=\"actor1\" x1=\"275\" y1=\"65\" x2=\"275\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"W\" data-et=\"life-line\" data-id=\"W\"></line><g id=\"root-1\" data-et=\"participant\" data-type=\"participant\" data-id=\"W\"><rect x=\"200\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"W\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"275\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"275\" dy=\"0\">Web app</tspan></text></g></g><g><line id=\"actor0\" x1=\"75\" y1=\"65\" x2=\"75\" y2=\"955\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"U\" data-et=\"life-line\" data-id=\"U\"></line><g id=\"root-0\" data-et=\"participant\" data-type=\"participant\" data-id=\"U\"><rect x=\"0\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"U\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"75\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">User</tspan></text></g></g><style>#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .error-icon{fill:#a44141;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .error-text{fill:#ddd;stroke:#ddd;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-thickness-normal{stroke-width:1px;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-thickness-thick{stroke-width:3.5px;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-pattern-solid{stroke-dasharray:0;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .marker{fill:lightgrey;stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .marker.cross{stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 p{margin:0;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .actor{stroke:#ccc;fill:#1f2020;stroke-width:1;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 rect.actor.outer-path[data-look=\"neo\"]{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 rect.note[data-look=\"neo\"]{stroke:hsl(180, 0%, 18.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 text.actor&gt;tspan{fill:lightgrey;stroke:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .actor-line{stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [id$=\"-arrowhead\"] path{fill:lightgrey;stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .sequenceNumber{fill:black;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [id$=\"-sequencenumber\"]{fill:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [id$=\"-crosshead\"] path{fill:lightgrey;stroke:lightgrey;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .messageText{fill:lightgrey;stroke:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .labelBox{stroke:#ccc;fill:#1f2020;filter:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .labelText,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .labelText&gt;tspan{fill:lightgrey;stroke:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .loopText,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .loopText&gt;tspan{fill:lightgrey;stroke:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .sectionTitle,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .sectionTitle&gt;tspan{fill:lightgrey;stroke:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#ccc;fill:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .note{stroke:hsl(180, 0%, 18.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .noteText,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .noteText&gt;tspan{fill:rgb(183.8476190475, 181.5523809523, 181.5523809523);stroke:none;font-weight:normal;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .activation0{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .activation1{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .activation2{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .actorPopupMenu{position:absolute;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .actorPopupMenuPanel{position:absolute;fill:#1f2020;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .actor-man circle,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 line{fill:#1f2020;stroke-width:2px;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 g rect.rect{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 .node .neo-node{stroke:#ccc;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node rect,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].cluster rect,#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node polygon{stroke:url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node path{stroke:url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-gradient);stroke-width:1px;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node circle{stroke:url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g></g><defs><symbol id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-computer\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z\"></path></symbol></defs><defs><symbol id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-database\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path transform=\"scale(.5)\" d=\"M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z\"></path></symbol></defs><defs><symbol id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-clock\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z\"></path></symbol></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead\" refX=\"7.9\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M -1 0 L 10 5 L 0 10 z\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-crosshead\" markerWidth=\"15\" markerHeight=\"8\" orient=\"auto\" refX=\"4\" refY=\"4.5\"><path fill=\"none\" stroke=\"#000000\" stroke-width=\"1pt\" d=\"M 1,2 L 6,7 M 6,2 L 1,7\" style=\"stroke-dasharray: 0, 0;\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-filled-head\" refX=\"15.5\" refY=\"7\" markerWidth=\"20\" markerHeight=\"28\" orient=\"auto\"><path d=\"M 18,7 L9,13 L14,7 L9,1 Z\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-sequencenumber\" refX=\"15\" refY=\"15\" markerWidth=\"60\" markerHeight=\"40\" orient=\"auto\"><circle cx=\"15\" cy=\"15\" r=\"6\"></circle></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-solidTopArrowHead\" refX=\"7.9\" refY=\"7.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 8 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-solidBottomArrowHead\" refX=\"7.9\" refY=\"0.75\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 0 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-stickTopArrowHead\" refX=\"7.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 7 7\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><defs><marker id=\"diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-stickBottomArrowHead\" refX=\"7.5\" refY=\"0\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 7 L 7 0\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><g data-et=\"note\" data-id=\"i2\"><rect x=\"250\" y=\"167\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"491\" height=\"38\" class=\"note\"></rect><text x=\"496\" y=\"172\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"496\">Web login journey</tspan></text></g><g data-et=\"note\" data-id=\"i11\"><rect x=\"691\" y=\"599\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"694\" height=\"38\" class=\"note\"></rect><text x=\"1038\" y=\"604\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"1038\">Mobile approval journey</tspan></text></g><g data-et=\"control-structure\" data-id=\"i15\"><line x1=\"64\" y1=\"261\" x2=\"1446\" y2=\"261\" class=\"loopLine\"></line><line x1=\"1446\" y1=\"261\" x2=\"1446\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"841\" x2=\"1446\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"261\" x2=\"64\" y2=\"841\" class=\"loopLine\"></line><line x1=\"64\" y1=\"413\" x2=\"1446\" y2=\"413\" class=\"loopLine\" style=\"stroke-dasharray: 3, 3;\"></line><polygon points=\"64,261 114,261 114,274 105.6,281 64,281\" class=\"labelBox\"></polygon><text x=\"89\" y=\"274\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"labelText\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">par</text><text x=\"780\" y=\"279\" text-anchor=\"middle\" class=\"loopText\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"780\">​</tspan></text></g><g data-et=\"note\" data-id=\"i16\"><rect x=\"250\" y=\"851\" fill=\"#EDF2AE\" stroke=\"#666\" width=\"491\" height=\"38\" class=\"note\"></rect><text x=\"496\" y=\"856\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"noteText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\"><tspan x=\"496\">Web login journey complete (access token)</tspan></text></g><text x=\"174\" y=\"80\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">login</text><line x1=\"76\" y1=\"111\" x2=\"271\" y2=\"111\" class=\"messageLine1\" data-et=\"message\" data-id=\"i0\" data-from=\"U\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"384\" y=\"126\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">startJourney()</text><line x1=\"276\" y1=\"157\" x2=\"491.5\" y2=\"157\" class=\"messageLine0\" data-et=\"message\" data-id=\"i1\" data-from=\"W\" data-to=\"WIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"1037\" y=\"220\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">push notification</text><line x1=\"717\" y1=\"251\" x2=\"1356\" y2=\"251\" class=\"messageLine0\" data-et=\"message\" data-id=\"i3\" data-from=\"M\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"276\" y=\"291\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">(Spinner) Waiting for mobile app</text><path d=\"M 276,322 C 336,312 336,352 276,342\" class=\"messageLine1\" data-et=\"message\" data-id=\"i5\" data-from=\"W\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"384\" y=\"367\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Polling</text><line x1=\"276\" y1=\"398\" x2=\"491.5\" y2=\"398\" class=\"messageLine1\" data-et=\"message\" data-id=\"i6\" data-from=\"W\" data-to=\"WIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"497\" y=\"438\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Display OTP code</text><line x1=\"715\" y1=\"469\" x2=\"279\" y2=\"469\" class=\"messageLine0\" data-et=\"message\" data-id=\"i8\" data-from=\"M\" data-to=\"W\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"1361\" y=\"484\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Parse notification</text><path d=\"M 1361,513 C 1421,503 1421,543 1361,533\" class=\"messageLine1\" data-et=\"message\" data-id=\"i9\" data-from=\"Mob\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"1151\" y=\"558\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">startMobileApproveJourney() with params</text><line x1=\"1359\" y1=\"589\" x2=\"942\" y2=\"589\" class=\"messageLine0\" data-et=\"message\" data-id=\"i10\" data-from=\"Mob\" data-to=\"MIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"716\" y=\"652\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Enter OTP</text><line x1=\"76\" y1=\"681\" x2=\"1356\" y2=\"681\" class=\"messageLine0\" data-et=\"message\" data-id=\"i12\" data-from=\"U\" data-to=\"Mob\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"1151\" y=\"696\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">submitClientResponse() with OTP</text><line x1=\"1359\" y1=\"727\" x2=\"942\" y2=\"727\" class=\"messageLine0\" data-et=\"message\" data-id=\"i13\" data-from=\"Mob\" data-to=\"MIDO\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"fill: none;\"></line><text x=\"717\" y=\"742\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">Validate OTP</text><path d=\"M 717,771 C 777,761 777,801 717,791\" class=\"messageLine1\" data-et=\"message\" data-id=\"i14\" data-from=\"M\" data-to=\"M\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></path><text x=\"177\" y=\"904\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">logged in</text><line x1=\"274\" y1=\"935\" x2=\"79\" y2=\"935\" class=\"messageLine1\" data-et=\"message\" data-id=\"i17\" data-from=\"W\" data-to=\"U\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-f1ab449c86d91a6989760ceaabdfaf8caa631911620ca2f1dd6de572c2c77253-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line></svg>"},"children":["sequenceDiagram\n  participant U as User\n  participant W as Web app\n  participant WIDO as Web Orchestration SDK\n  participant M as Mosaic\n  participant MIDO as Mob. Orchestration SDK\n  participant B as Mob. Auth. SDK\n  participant Mob as Mobile app\nU -->> W: login\nW ->> WIDO: startJourney()\nnote over W, M: Web login journey\nM ->> Mob: push notification\npar\nW -->> W: (Spinner) Waiting for mobile app\nW -->> WIDO: Polling\nand\nM ->> W: Display OTP code\nMob -->> Mob: Parse notification\nMob ->> MIDO: startMobileApproveJourney() with params\nnote over Mob, M: Mobile approval journey\nU ->> Mob: Enter OTP\nMob ->> MIDO: submitClientResponse() with OTP\nM -->> M: Validate OTP\nend\nnote over W, M: Web login journey complete (access token)\nW -->> U: logged in\n"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"before-you-start","__idx":2},"children":["Before you start"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the Admin Portal, create an application and then create or select two ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["User authentication clients"]}," configured for ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OIDC"]}," within it: one with ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Client type"]}," set to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Web app"]}," and one with ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Client type"]}," set to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Native app"]},". Obtain both client IDs (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/create_new_application"},"children":["Create applications"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/manage_clients#oidc-flow"},"children":["Manage clients"]},"). If using ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/sso_orchestration/sso_config_service"},"children":["SSO and Federation"]}," service, use its client IDs instead. Make sure to execute the flow within the context of the same Mosaic application."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-configure-push-notification-channels","__idx":3},"children":["Step 1: Configure push notification channels"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["Admin Portal"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["one-time configuration"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before you add a new login type to your application, configure the push notifications settings for your app (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin Portal"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Applications"]}," > your app > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authentication methods"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Push notifications"]},")."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Apple"]},": in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Apple Push Notifications Service (APN)"]},", provide the Apple push key, APN key ID, and Team ID which can be obtained from your Apple developer account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Android"]},": in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Firebase Cloud Messaging (FCM)"]},", provide the Firebase service account key that can be obtained in the Google Cloud console."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Mosaic supports multiple push notification configurations for Apple devices only. This is because APNs requires explicitly the app’s bundle ID to verify the destination app. In contrast, Android (FCM) doesn’t require a package ID—the push token already includes the app identity, and validation is handled via the FCM server key."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-build-journeys","__idx":4},"children":["Step 2: Build journeys"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["Admin portal"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["one-time configuration"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Journeys handle the business logic responsible for this flow. To facilitate journey development, you can build your journeys based the following journey templates (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin Portal"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["B2C Identity"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["B2B Identity"]}," ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["based on your setup"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Journeys"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Templates"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Guides"]},"):"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#1-mobile-app-registration-journey"},"children":["Web to mobile flow: mobile app registration journey"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-mobile-approve-journey"},"children":["Web to mobile flow: mobile approve journey"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web to mobile flow: web login journey"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Store the journey IDs as you will need them later."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To support you in following this guide, we recommend generating code for each journey from the journey editor, making sure you choose the format that matches your working environment (",{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/journey-editor-tool-button.6a4af32fb50429b4c2a371250e9d83bcbbcf505136a4635497e32aa10817cb2e.d044259d.png","width":"25","style":{"verticalAlign":"middle"}},"children":[]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Integration code"]},"). For more about generating code, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/code_generation"},"children":["Code generation for local testing"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-mobile-app-registration-journey","__idx":5},"children":["1. Mobile app registration journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This client SDK journey runs on the user's mobile device and ensures the device is ready to be used for authentication in the web to mobile flow. It includes the following actions:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Obtains the user's email (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/get_info_from_client"},"children":["Collect information"]}," step)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checks if the user exists and creates a new user (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/create_user"},"children":["Create user"]}," step) if necessary."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cryptographically binds a mobile device to the user record (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/register_device"},"children":["Register or Update Device"]}," step) and registers a push token for this device. The user context for the device registration journey is provided by the journey itself. This step ensures Mosaic can recognize this device as trusted for push notifications."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Depending on results, successfully completes the journey (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/complete_journey"},"children":["Complete journey"]}," step) or rejects access (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/reject_access"},"children":["Reject access"]}," step)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-mobile-approve-journey","__idx":6},"children":["2. Mobile approve journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This mobile approval journey automatically validates the registered device and then facilitates the OTP validation as part of the approval granting in the mobile app. It includes the following actions:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/validate_otp"},"children":["Validate OTP"]}," step, which prompts the user to enter the OTP in the mobile app's user interface. This step then validates the code against the one generated by the web journey."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Depending on results, successfully completes the journey (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/complete_journey"},"children":["Complete journey"]}," step) or rejects access (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/reject_access"},"children":["Reject access"]}," step)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Mosaic allows accessing parameters sent from the initiating web journey using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["@policy.getMobileApproveParameters()"]},". For example, you can set the external user identifier to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["@policy.getMobileApproveParameters().external_user_id"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/auth_web_to_mobile_mobile_approve_params.d92846b872694ff58915b8d6173766c4157b7847f10b242f146af02ac1ea5506.6f9096f8.png","alt":""},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"table"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Parameter"},"children":["Parameter"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["approval_data"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JSON object containing the transaction details to approve as specified in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web login journey"]}," in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/transaction_signing_mobile_approve"},"children":["Web to mobile transaction signing"]}," step. For details about transaction signing, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#transaction-signing"},"children":["Transaction signing"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["additional_data"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JSON object containing additional data passed from the web journey."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["correlation_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ID of the flow obtained from Web login journey that helps relate user interactions, if available."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["device_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ID of the user's mobile device running the mobile approve flow."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["external_user_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["External user ID specified in the Web login journey, if known."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journey_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Web login journey ID."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User ID specified in the Web login journey, if known."]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once the user approves the action by validating the OTP in the mobile app, this will resume the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web login journey"]},"—the user can return back to the browser to complete the flow. The web login journey will reject access unless the user authenticated on mobile."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-web-login-journey","__idx":7},"children":["3. Web login journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This client SDK journey runs in the browser app and starts the web to mobile authentication flow. It includes the following actions:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Obtains an external user ID (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/login_form"},"children":["Login form"]}," step) and enables web to mobile authentication."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initiates the web to mobile authentication flow (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/authenticate_mobile_approve"},"children":["Web to mobile authentication"]}," step) and logs in the user after they approve the request on mobile."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["(Optional) If you enabled the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Display Web OTP"]}," option in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/authenticate_mobile_approve"},"children":["Web to Mobile Authentication"]}," step, you must also add a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/validate_otp"},"children":["Validate OTP"]}," step to the mobile approve journey. This ensures the user enters and validates the code displayed in the web journey as part of the authentication flow."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Depending on results, successfully completes the journey (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/complete_journey"},"children":["Complete journey"]}," step) or rejects access (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/reject_access"},"children":["Reject access"]}," step)."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Having created a journey from the \"Web to mobile flow: web login journey\" template, link it to the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-mobile-approve-journey"},"children":["mobile approve journey"]},". To do this, in the Web to mobile authentication step locate the Mobile journey drop-down and select the mobile approve journey you've created before."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In case of successful journey completion, user access token will become available with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["@policy.userContext()"]},"."]},{"$$mdtype":"Tag","name":"figure","attributes":{"style":{"margin":"0"}},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/assets/web2mobile-web-login.e48304ceae2f988fbd54f6e215b957c3056b6f1622353e927d084eab2cbd4503.6f15bb72.png","target":"_blank"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/web2mobile-web-login.e48304ceae2f988fbd54f6e215b957c3056b6f1622353e927d084eab2cbd4503.6f15bb72.png","alt":"Web login journey","style":{"maxWidth":"100%"}},"children":[]}]},{"$$mdtype":"Tag","name":"figcaption","attributes":{"style":{"color":"grey","fontStyle":"italic","fontSize":"14px"}},"children":["Click to open the image in a dedicated tab."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-add-mobile-sdks","__idx":8},"children":["Step 3: Add mobile SDKs"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["mobile client"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To run this flow, your integration needs the Orchestration SDK (for ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/identityOrchestration-ios-sdk-docs/documentation/identityorchestration/"},"children":["iOS"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/ido-android-api-reference/index.html"},"children":["Android"]},") and Authentication SDK (for ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/authentication-ios-sdk-docs/documentation/tsauthenticationsdk/"},"children":["iOS"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/authentication-android-docs/"},"children":["Android"]},") to enable your application to use mobile biometrics and invoke journeys."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make sure to initialize mobile SDKs within the context of the same client ID."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For Android, see instructions here:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adding to project: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/android_sdk_guide/#step-1-installation"},"children":["Orchestration SDK"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/be_auth_biometrics_android/#step-1-add-sdk-to-your-project"},"children":["Authentication SDK"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initializing: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/android_sdk_guide/#step-2-initialize-sdk"},"children":["Orchestration SDK"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/be_auth_biometrics_android/#step-2-initialize-the-sdk"},"children":["Authentication SDK"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For iOS, see instructions here:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Loading: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/ios_sdk_guide/#step-1-installation"},"children":["Orchestration SDK"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/be_auth_biometrics_ios/#step-1-add-sdk-to-your-project"},"children":["Authentication SDK"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initializing: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/ios_sdk_guide/#step-2-initialize-sdk"},"children":["Orchestration SDK"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/be_auth_biometrics_ios/#step-2-initialize-the-sdk"},"children":["Authentication SDK"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-implement-mobile-app-registration","__idx":9},"children":["Step 4: Implement mobile app registration"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["mobile client"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement the client-side code needed to register a mobile app on the device (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#1-mobile-app-registration-journey"},"children":["Mobile app registration"]}," journey). Note that this code must be executed on the first run of the mobile app."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Registration is a prerequisite to authenticating with push notifications. Mosaic cannot send push notifications to a user's device unless the user exists and their mobile app was registered."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In a nutshell, you have to implement:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#1-registering-a-device-token"},"children":["Registering a device token"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-starting-the-journey"},"children":["Starting the journey"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-collecting-users-email"},"children":["Collecting user's email"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#4-registering-mobile-biometrics"},"children":["Registering biometrics"]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Implementation tips"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, implement a switch (or other routing mechanism) that invokes a handler responsible for a specific journey step (returned in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.journeyStepId"]}," parameter). Each handler processes data, displays whatever UI is needed, and calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitClientResponse()"]}," when the interaction is concluded."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The journey loops back to the switch unless Mosaic signals journey completion by setting the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyStepId"]}," property to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Rejection.type"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Success.type"]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.token"]}," property contains a JWT token as a proof of journey completion."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more guidance on mobile development with the Orchestration SDK, refer to these quickstarts: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_android"},"children":["Android"]}," or ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_ios"},"children":["iOS"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-registering-a-device-token","__idx":10},"children":["1. Registering a device token"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement a controller for registering the mobile device as a target for push notifications and setting the push token in the Orchestration SDK. Design your app in the way that this code gets executed right after the SDK initialization. This step is needed to later receive push notifications in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-mobile-approve-journey"},"children":["Mobile approve journey"]},". See a sample code below:"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  import UIKit\n  import UserNotifications\n\n  @main\n  class AppDelegate: UIResponder, UIApplicationDelegate {\n\n      var window: UIWindow?\n\n      func application(\n          _ application: UIApplication,\n          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n      ) -> Bool {\n\n          // Request notification authorization\n          UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in\n              if granted {\n                  debugPrint(\"[DEBUG]: Permission granted for notifications.\")\n                  DispatchQueue.main.async {\n                      // Register for remote notifications\n                      application.registerForRemoteNotifications()\n                  }\n              } else {\n                  debugPrint(\"[DEBUG] Notification permission denied: \\(error?.localizedDescription ?? \"No error information\")\")\n              }\n          }\n\n          return true\n      }\n\n      // Called when the user grants permission and the app successfully registers for notifications\n      func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {\n          // Convert the token to a string\n          let token = deviceToken.map { String(format: \"%02.2hhx\", $0) }.joined()\n          debugPrint(\"[DEBUG] Device token: \\(token)\")\n\n          // Provide push token to the Orchestration SDK\n          do {\n              try TSIdo.setPushToken(token)\n          } catch {\n              debugPrint(\"[DEBUG] Error while setting push token: \\(error)\")\n          }\n      }\n\n      // Called if the registration fails\n      func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {\n          debugPrint(\"[DEBUG] Failed to register for remote notifications: \\(error.localizedDescription)\")\n      }\n  }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  // Register token\n  TSIdo.initializeSDK(context)\n  Firebase.messaging.token.addOnCompleteListener {\n    if (it.isSuccessful) {\n       // Set the FCM registration token\n       TSIdo.setPushToken(it.result)\n    } else {\n       Log.w(TAG, \"Fetching FCM registration token failed\", it.exception)\n    }\n  }\n\n  // To handle push token updates\n  class MyFirebaseMessagingService : FirebaseMessagingService() {\n      override fun onNewToken(token: String) {\n         super.onNewToken(token)\n         // Pass the token to IDO SDK, make sure it was already initialized\n         if (tsIdoWasInitialized) {\n            TSIdo.setPushToken(token)\n         }\n      }\n  }\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-starting-the-journey","__idx":11},"children":["2. Starting the journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement a handler that starts the journey on the first application run. Use the following call to start the journey:"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  do {\n      try TSIdo.startJourney(journeyId: \"YOUR_JOURNEY_ID\")\n  } catch {\n      debugPrint(\"[DEBUG] Failed to start journey: \\(error)\")\n  }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  TSIdo.startJourney(\"YOUR_JOURNEY_ID\", startJourneyOptions, callback)\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-collecting-users-email","__idx":12},"children":["3. Collecting user's email"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement code that obtains user's email from a form and passes it to the Orchestration SDK."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  // Presenting view controller\n  let formViewController = FormViewController()\n  navigationController?.pushViewController(formViewController, animated: true)\n\n  // Inside the View Controller:\n   @IBAction func onSubmitForm() {\n      // Collect the form data\n      let email = emailInput.text\n\n      // Convert form data to JSON format\n      let formData =  {\n         email: \"john@doe.com\"\n      }\n\n      // Submit the data to the SDK\n      TSIdo.submitClientResponse(clientResponseOptionId: .clientInput, data: formData)\n   }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  // Stores the collected email\n  // The data will look like this:\n  // {\n  //   \"email\": \"john@doe.com\"\n  // }\n  data class RegistrationData(val full_name: String, val email: String)\n\n  fun submitRegistrationData() {\n      // Assumes the UI shows EditText - etCollectEmail, to collect the email\n      val responseData = RegistrationData(binding.etCollectEmail.text.toString())\n\n      // Submits data to the SDK\n      TSIdo.submitClientResponse(TSIdoClientResponseOptionType.ClientInput.type, responseData, callback)\n  }\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-registering-mobile-biometrics","__idx":13},"children":["4. Registering mobile biometrics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement collection and registration of user's biometrics."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  guard let userId = response.data?[\"user_identifier\"] as? String else {\n              return debugPrint(\"[DEBUG]: No user identifier found in response\")?\n          }\n\n          // Registers biometric credentials on the device using the Authentication SDK\n          TSAuthentication.shared.registerNativeBiometrics(username: userId) { result in\n              switch result {\n              case .success(let response):\n\n                  var data: [String: Any] = [\n                      \"publicKey\": response.publicKey,\n                      \"publicKeyId\": response.publicKeyId,\n                      \"os\": \"ios\"\n                  ]\n\n                  if let attestation = response.attestation {\n                      data[\"attestation\"] = attestation\n                  }\n\n                  // Submits the registration result back to the journey using the Orchestration SDK\n                  do {\n                      try TSIdo.submitClientResponse(clientResponseOptionId: .clientInput, data: data)\n                  } catch {\n                      debugPrint(\"[DEBUG] Failed to submit biometric registration result: \\(error)\")\n                  }\n              case .failure(let error):\n                  debugPrint(\"[DEBUG] Error: \\(error)\")\n                  do {\n                      try TSIdo.submitClientResponse(clientResponseOptionId: .fail)\n                  } catch {\n                      debugPrint(\"[DEBUG] Failed to submit biometric registration failure: \\(error)\")\n                  }\n              }\n          }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  data class BiometricsRegistrationResult(val publicKeyId: String, val publicKey: String, val os: String = \"Android\")\n  ...\n  private fun registerBiometricsAndSubmit() {\n      val userId = idoResponse.responseData?.optString(\"user_identifier\")\n      userId?.let {\n          TSAuthentication.registerNativeBiometrics(context, it, object: TSAuthCallback<TSBiometricsRegistrationResult, TSBiometricsRegistrationError>{\n              override fun error(error: TSBiometricsRegistrationError) {\n                  //handle registration error\n              }\n\n              override fun success(result: TSBiometricsRegistrationResult) {\n                  Log.d(TAG, \"Biometrics registration success\")\n                  TSIdo.submitClientResponse(TSIdoClientResponseOptionType.ClientInput.type, BiometricsRegistrationResult(result.keyId(), result.publicKey()), callback)\n              }\n          })\n      }\n  }\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-implement-mobile-app-approval","__idx":14},"children":["Step 5: Implement mobile app approval"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["mobile client"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement client-side code that processes the push notification sent by Mosaic and executes the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-mobile-approve-journey"},"children":["Mobile approval journey"]}," with the parameters retrieved from notification."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In a nutshell, you have to implement:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#1-processing-push-notification-and-starting-mobile-approve-journey"},"children":["Processing push notification and starting mobile approve jourey"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-authenticating-with-mobile-biometrics"},"children":["Authenticating with mobile biometrics"]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Implementation tips"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, implement a switch (or other routing mechanism) that invokes a handler responsible for a specific journey step (returned in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.journeyStepId"]}," parameter). Each handler processes data, displays whatever UI is needed, and calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitClientResponse()"]}," when the interaction is concluded."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The journey loops back to the switch unless Mosaic signals journey completion by setting the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyStepId"]}," property to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Rejection.type"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Success.type"]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.token"]}," property contains a JWT token as a proof of journey completion."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more guidance on mobile development with the Orchestration SDK, refer to these quickstarts: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_android"},"children":["Android"]}," or ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_ios"},"children":["iOS"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-processing-push-notification-and-starting-mobile-approve-journey","__idx":15},"children":["1. Processing push notification and starting mobile approve journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add the following code to read the push notification payload and retrieve parameters for invoking the mobile journey."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Unlike regular journeys, Mobile approve journeys are invoked with a special SDK call: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startMobileApproveJourney()"]},"."]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  // Called when the user taps the notification or interacts with it\n  func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void\n  ) {\n      // Get the custom data associated with the notification.\n      let userInfo = response.notification.request.content.userInfo\n\n      // Read the approval payload\n      guard let approvalPayload = userInfo[\"data\"] as? [String: Any] else {\n          debugPrint(\"[DENUG]: No approval data found in push notification\")\n          return\n      }\n\n      // Start mobile approve journey providing push notification approval payload\n      TSIdo.startMobileApproveJourney(payload: approvalPayload)\n\n      debugPrint(\"[DEBUG]: approvalPayload: \\(approvalPayload)\")\n\n      completionHandler()\n  }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  class MyFirebaseMessagingService : FirebaseMessagingService() {\n      override fun onMessageReceived(remoteMessage: RemoteMessage) {\n         Log.d(TAG, \"Push notification received from: ${remoteMessage.from}\")\n         remoteMessage.data?.let {\n              Log.d(TAG, \"building notification\")\n              //build notification and use remoteMessage.data to invoke TSIdo.startMobileApproveJourney() API\n          }\n      }\n  }\n  ...\n  //after the user tapped the notification, startMobileApproveJourney api should be invoked with the data received in the\n  //firebase message - approvalPayload = remoteMessage.data\n  TSIdo.startMobileApproveJourney(approvalPayload,\n      TSIdoStartJourneyOptions(null, \"\"), callback)\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-authenticating-with-mobile-biometrics","__idx":16},"children":["2. Authenticating with mobile biometrics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, to support authenticating with mobile biometrics, implement the following on the client side. See Mosaic Authentication SDK reference for ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/authentication-ios-sdk-docs/documentation/tsauthenticationsdk/tsauthentication/"},"children":["iOS"]}," or ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://transmitsecurity.github.io/authentication-android-docs/"},"children":["Android"]}," for more details."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"swift","key":"swift"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"  // Authentication challenge provided by the journey\n  guard let challenge = serverResponse?.data[\"biometrics_challenge\"] as? String else {\n      return\n  }\n\n  // Authenticates the user with their biometric credentials using the Authentication SDK\n  TSAuthentication.shared.authenticateNativeBiometrics(username: \"[USER_ID]\", challenge: challenge) { result in\n      switch result {\n      case .success(let response):\n          let data: [String: Any] = [\n              \"publicKeyId\": response.publicKeyId,\n              \"signedChallenge\": response.signature,\n              \"userIdentifier\": \"[USER_ID]\"\n          ]\n\n          // Submits the authentication result to the journey using the Orchestration SDK\n          do {\n              try TSIdo.submitClientResponse(clientResponseOptionId: .clientInput, data: data)\n          } catch {\n              debugPrint(\"[DEBUG] Failed to submit biometric authentication result: \\(error)\")\n          }\n      case .failure(let error):\n          debugPrint(\"[DEBUG] Error: \\(error)\")\n          do {\n              try TSIdo.submitClientResponse(clientResponseOptionId: .fail)\n          } catch {\n              debugPrint(\"[DEBUG] Failed to submit biometric authentication failure: \\(error)\")\n          }\n      }\n  }\n","lang":"swift"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"kotlin","key":"kotlin"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"  data class BiometricsAuthenticationResult(val publicKeyId: String, val userIdentifier: String, val signedChallenge: String)\n  ...\n  private fun authenticateBiometrics() {\n      val userIdentifier = idoResponse.responseData?.optString(\"user_identifier\")\n      val challenge = idoResponse.responseData?.optString(\"biometrics_challenge\")\n      activity?.let {\n          TSAuthentication.authenticateNativeBiometrics(it, userIdentifier, challenge, BiometricPromptTexts(\"[TITLE], \"[SUB_TITLE]\", \"[NEGATIVE_BUTTON_TEXT]),\n              object: TSAuthCallback<TSBiometricsAuthResult, TSBiometricsAuthError> {\n                  override fun error(error: TSBiometricsAuthError) {\n                      //handle error\n                  }\n\n                  override fun success(result: TSBiometricsAuthResult) {\n                      Log.d(TAG, \"Biometrics authentication success\")\n                      TSIdo.submitClientResponse(TSIdoClientResponseOptionType.ClientInput.type, BiometricsAuthenticationResult(result.keyId(), userIdentifier, result.signature()), callback)\n                  }\n              })\n      }\n  }\n","lang":"kotlin"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-6-add-web-sdk","__idx":17},"children":["Step 6: Add web SDK"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["web client"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To run this flow from the web app, you need integration with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/sdk-ref/idosdk/overview"},"children":["Orchestration SDK"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In particular, you'll need to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["load or install the SDK (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/web_sdk_guide/#step-1-load-sdk"},"children":["Web"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["initialize the SDK (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/sdk/web_sdk_guide/#step-2-initialize-sdk"},"children":["Web"]},")."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ensure that the Web SDK is initialized within the Client ID that belongs to the same application as the client ID used to initialize the Mobile SDKs."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-7-implement-web-to-mobile-request","__idx":18},"children":["Step 7: Implement web to mobile request"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["web client"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement the client-side code for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web login"]}," journey. In a nutshell, you have to implement:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#1-starting-the-journey"},"children":["Starting the journey"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-collecting-users-email"},"children":["Collecting user's email"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-invoking-web-to-mobile-authentication"},"children":["Invoking web to mobile authentication"]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Implementation tips"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, implement a switch (or other routing mechanism) that invokes a handler responsible for a specific journey step (returned in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.journeyStepId"]}," parameter). Each handler processes data, displays whatever UI is needed, and calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitClientResponse()"]}," when the interaction is concluded."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The journey loops back to the switch unless Mosaic signals journey completion by setting the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyStepId"]}," property to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Rejection.type"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Success.type"]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idoServiceResponse.token"]}," property contains a JWT token as a proof of journey completion."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more guidance on web development with the Orchestration SDK, refer to this quickstart: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_web"},"children":["Web"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-starting-the-journey","__idx":19},"children":["1. Starting the journey"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Starting a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web login journey"]}," is usually a response to a user interaction, such as clicking a login button."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"const idoResponse = await window.tsPlatform.ido.startJourney(\n      'YOUR_JOURNEY'\n  );\n","lang":"js"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-collecting-users-email","__idx":20},"children":["2. Collecting user's email"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement obtaining user's email. For example, your application should present a form that collects a user email and passes it the Orchestration SDK."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"function handleGetInformationFromClient(idoResponse) {\n  // Generate the form's HTML\n  const formHtml = `<form id=\"updateForm\">\n    <input type=\"email\" id=\"email\" name=\"email\" placeholder=\"email\" />\n    <button>Submit</button>\n  </form>`;\n\n  // Render the form\n  document.body.innerHTML = formHtml;\n\n  document.querySelector('#updateForm').addEventListener('submit', function(event) {\n    event.preventDefault();\n\n    // Collect the form data\n    const form = event.target;\n    const formData = new FormData(form);\n\n    // The data will look like this:\n    // {\n    //   \"email\": \"john@doe.com\"\n    // }\n    const data = Object.fromEntries(formData.entries());\n\n    // Submit the data to the SDK\n    window.tsPlatform.ido.submitClientResponse(ClientResponseOptionType.ClientInput, data);\n  });\n}\n","lang":"js"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-invoking-web-to-mobile-authentication","__idx":21},"children":["3. Invoking web to mobile authentication"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement the handler for the Web to Mobile Authentication journey step. Your client side should account for the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If the user has more than one device registered, the SDK will return the list of user's devices. Present a screen to let user decide which device to use for authentication."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement polling. To avoid being rate limited, make sure to poll in accordance with the polling interval set in the journey settings (2-5 seconds)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["While the journey polls SDK for the mobile journey outcome, present a spinner or any other UI element to notify the user that the process is on hold and will resume later."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement ability to cancel authentication."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement ability to resend a push notification."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This flow completes successfully and the user is granted access to the web app only if they have authenticated on the mobile device (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#2-mobile-approve-journey"},"children":["Mobile approve journey"]},")."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"function handleWebToMobileAuthentication(idoResponse) {\n  // Check if devices are present in the idoResponse\n  if (idoResponse.data.devices) {\n    // If devices are present, handle device selection\n    handleDeviceSelection(idoResponse);\n  } else {\n    // If devices are not present, handle polling\n    handlePolling(idoResponse);\n  }\n}\n\nfunction handleDeviceSelection(idoResponse) {\n  const html = `\n    <div>\n      <h1>Select a device</h1>\n      <select id=\"device_select\">\n        ${idoResponse.data.devices\n          .map(\n            (device) => `<option value=\"${device.code}\">${device.name}</option>`\n          )\n          .join(\"\")}\n      </select>\n      <button id=\"select_device_button\">Continue</button>\n    </div>\n  `;\n\n  document.body.innerHTML = html;\n\n  document\n    .querySelector(\"#select_device_button\")\n    .addEventListener(\"click\", () => {\n      const deviceCode = document.querySelector(\"#device_select\").value;\n\n      // Submit the selected device code to the SDK\n      window.tsPlatform.ido.submitClientResponse(\n        ClientResponseOptionType.ClientInput,\n        {\n          selected_device_code: deviceCode,\n        }\n      );\n    });\n}\n\nfunction handlePolling(idoResponse) {\n  const pollingInterval = idoResponse.data.polling_interval * 1000; // Convert seconds to milliseconds\n  const resendAttemptsLeft = idoResponse.data.resend_attempts_left;\n\n  const html = `\n    <div>\n      <h1>Waiting for Approval</h1>\n      <p>Please approve the transaction on your mobile device.</p>\n      <button id=\"cancel_button\">Cancel</button>\n      <button id=\"resend_button\" ${\n        resendAttemptsLeft === 0 ? \"disabled\" : \"\"\n      }>Resend</button>\n    </div>\n  `;\n\n  document.body.innerHTML = html;\n\n  document.querySelector(\"#cancel_button\").addEventListener(\"click\", () => {\n    // Submit the cancel response to the SDK\n    window.tsPlatform.ido.submitClientResponse(ClientResponseOptionType.Cancel);\n  });\n\n  document.querySelector(\"#resend_button\").addEventListener(\"click\", () => {\n    // Check if there are resend attempts left\n    if (resendAttemptsLeft > 0) {\n      // Submit the resend response to the SDK\n      window.tsPlatform.ido.submitClientResponse(ClientResponseOptionType.Resend);\n    }\n  });\n\n  setTimeout(() => {\n    // Submit a response back to the SDK\n    // As long as the mobile device has not approved, we will keep receiving the same idoResponse with polling data\n    window.tsPlatform.ido.submitClientResponse(ClientResponseOptionType.ClientInput, {});\n  }, pollingInterval);\n}\n","lang":"js"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transaction-signing","__idx":22},"children":["Transaction signing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["transaction signing"]}," with push notifications by swapping the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/authenticate_mobile_approve"},"children":["Web to mobile athentication"]}," step with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/transaction_signing_mobile_approve"},"children":["Web to mobile transaction signing"]}," step in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#3-web-login-journey"},"children":["Web login journey"]}," and passing along the transaction details for the user to approve in the mobile journey. The approval data is a JSON object, its fields may include expressions. The keys and values of approval data can only contain digits, characters and special symbols: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["-._"]},". For example:"]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Signing artifacts"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After the user approves the transaction on their mobile device, the web journey output includes signing artifacts (for example, the approval data, signed data, signature, and public key). Retain these data as evidence of the approval for later audit and independent verification. You can view the output in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/journey_analytics"},"children":["Journey Analytics"]},". For field definitions, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/user/transaction_signing_offline_verification"},"children":["Offline transaction signing verification"]},"."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"shell","header":{"controls":{"copy":{}}},"source":"{\n  \"amount\": clientData.transactionAmount,\n  \"currency\": \"USD\",\n  \"payee\": clientData.payee\n}\n","lang":"shell"},"children":[]},{"$$mdtype":"Tag","name":"figure","attributes":{"style":{"margin":"0"}},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/assets/transaction_signing_web_to_mobile_ex1.86708994410850bf98a22d636ff7b5b8b1f7c2ff3a503b3e3c0203fe7714f04d.6f9096f8.png","target":"_blank"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/transaction_signing_web_to_mobile_ex1.86708994410850bf98a22d636ff7b5b8b1f7c2ff3a503b3e3c0203fe7714f04d.6f9096f8.png","alt":"Web to mobile step settings in editor","style":{"maxWidth":"100%"}},"children":[]}]},{"$$mdtype":"Tag","name":"figcaption","attributes":{"style":{"color":"grey","fontStyle":"italic","fontSize":"14px"}},"children":["Click to open the image in a dedicated tab."]}]},{"$$mdtype":"Tag","name":"style","attributes":{},"children":["\n    section article ol li {\n        margin-top: 6px !important;\n    }\n\n    th {\n      min-width: 155px;\n    }\n"]}]},"headings":[{"value":"Login with push (web to mobile approve)","id":"login-with-push-web-to-mobile-approve","depth":1},{"value":"How it works","id":"how-it-works","depth":2},{"value":"Before you start","id":"before-you-start","depth":2},{"value":"Step 1: Configure push notification channels","id":"step-1-configure-push-notification-channels","depth":2},{"value":"Step 2: Build journeys","id":"step-2-build-journeys","depth":2},{"value":"1. Mobile app registration journey","id":"1-mobile-app-registration-journey","depth":3},{"value":"2. Mobile approve journey","id":"2-mobile-approve-journey","depth":3},{"value":"3. Web login journey","id":"3-web-login-journey","depth":3},{"value":"Step 3: Add mobile SDKs","id":"step-3-add-mobile-sdks","depth":2},{"value":"Step 4: Implement mobile app registration","id":"step-4-implement-mobile-app-registration","depth":2},{"value":"1. Registering a device token","id":"1-registering-a-device-token","depth":3},{"value":"2. Starting the journey","id":"2-starting-the-journey","depth":3},{"value":"3. Collecting user's email","id":"3-collecting-users-email","depth":3},{"value":"4. Registering mobile biometrics","id":"4-registering-mobile-biometrics","depth":3},{"value":"Step 5: Implement mobile app approval","id":"step-5-implement-mobile-app-approval","depth":2},{"value":"1. Processing push notification and starting mobile approve journey","id":"1-processing-push-notification-and-starting-mobile-approve-journey","depth":3},{"value":"2. Authenticating with mobile biometrics","id":"2-authenticating-with-mobile-biometrics","depth":3},{"value":"Step 6: Add web SDK","id":"step-6-add-web-sdk","depth":2},{"value":"Step 7: Implement web to mobile request","id":"step-7-implement-web-to-mobile-request","depth":2},{"value":"1. Starting the journey","id":"1-starting-the-journey","depth":3},{"value":"2. Collecting user's email","id":"2-collecting-users-email","depth":3},{"value":"3. Invoking web to mobile authentication","id":"3-invoking-web-to-mobile-authentication","depth":3},{"value":"Transaction signing","id":"transaction-signing","depth":2}],"frontmatter":{"excludeFromSearch":true,"markdown":{"toc":{"depth":2}},"title":"Login (journey-based)","seo":{"title":"Login with push (web to mobile approve)"}},"lastModified":"2026-08-31T15:44:55.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/user/auth_web_to_mobile_otp","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}