<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David Minnema</title>
    <description>The latest articles on DEV Community by David Minnema (@mactesting12).</description>
    <link>https://dev.to/mactesting12</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F914310%2Fe6d925cb-1645-4def-9dae-7764698abe95.png</url>
      <title>DEV Community: David Minnema</title>
      <link>https://dev.to/mactesting12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mactesting12"/>
    <language>en</language>
    <item>
      <title>Okta Workflows / Duo Auth</title>
      <dc:creator>David Minnema</dc:creator>
      <pubDate>Mon, 22 Aug 2022 08:00:00 +0000</pubDate>
      <link>https://dev.to/oktaworkflows/okta-workflows-duo-auth-2bnm</link>
      <guid>https://dev.to/oktaworkflows/okta-workflows-duo-auth-2bnm</guid>
      <description>&lt;p&gt;We are in the midst of implementing Duo within our org and want to use it just about everywhere, including Okta Workflows. We have been building Slack slash commands that do some serious changes (more posts on those later) and we thought prompting the user running the command with Duo would be another layer of security (after verifying they are in the appropriate Okta Groups to perform the action to begin with.)&lt;/p&gt;

&lt;p&gt;Here’s how we implemented Duo Auth in Connector builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Duo&lt;/li&gt;
&lt;li&gt;Okta Workflows&lt;/li&gt;
&lt;li&gt;Connector Builder Beta&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Turning on Connector Builder
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to Okta Admin Console&lt;/li&gt;
&lt;li&gt;Click Settings &amp;gt; Features&lt;/li&gt;
&lt;li&gt;Turn on &lt;a href="https://help.okta.com/wf/en-us/Content/Topics/Workflows/connector-builder/connector-builder.htm"&gt;Workflows Connector Builder&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sFwbNXs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/0-Turn-on-Workflows-Connector-Builder.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sFwbNXs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/0-Turn-on-Workflows-Connector-Builder.png" alt="" width="872" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Connector
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click the + Button to add a new connector and name it something that makes sense in your org. We used “Duo Auth API.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SzUVMcQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/0.5-Create-New-Connector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SzUVMcQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/0.5-Create-New-Connector.png" alt="" width="274" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You will be greeted with an Overview tab where we can start by creating the necessary authentication. Click “Set up authentication”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S-FTqkM5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Connector-Overview-300x153.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S-FTqkM5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Connector-Overview-300x153.png" alt="" width="300" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select “Custom” Auth Type&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K6rHXXfM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Select-Auth-Type.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K6rHXXfM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Select-Auth-Type.png" alt="" width="242" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the following Parameters and types then click Save.

&lt;ul&gt;
&lt;li&gt;Integration Key – Text&lt;/li&gt;
&lt;li&gt;Secret Key – Password&lt;/li&gt;
&lt;li&gt;API Hostname – Text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wu13xIDi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Custom-Parameters.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wu13xIDi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Custom-Parameters.png" alt="" width="792" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Action Flow
&lt;/h2&gt;

&lt;p&gt;Connector Builder does not yet have the ability to import flows so we’ll have to build from scratch. That is documented below. If Connector Builder adds the ability to import flows, those are in the &lt;a href="https://github.com/mactesting12/Duo-Auth-Okta-Workflows-Connector"&gt;attached Github repo&lt;/a&gt;. This builds out a Raw Request to the Duo Auth API based on the documentation here: &lt;a href="https://duo.com/docs/authapi#authentication"&gt;https://duo.com/docs/authapi#authentication&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the Flow tab and “Create a New Flow Now”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NXoQb1Wh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Create-New-Flow-1024x316.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NXoQb1Wh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Create-New-Flow-1024x316.png" alt="" width="880" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click “Unnamed” to name the action. We’ll call this Prompt. Create a description (this will be seen in Okta workflows when choosing an action) Also check the box to Save all data that passes through the Flow. Click Save.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EybtmiXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5.5-Name-Flow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EybtmiXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5.5-Name-Flow.png" alt="" width="629" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Add event &amp;gt; Action&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jr2ZGtKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7.5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jr2ZGtKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7.5.png" alt="" width="880" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Add inputs in the Connector Action Card &amp;gt; Click Add Group add the Label “Email Address” and make it Required &amp;gt; Click Save.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OCGfz56c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/11.5-1024x356.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OCGfz56c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/11.5-1024x356.png" alt="" width="880" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Add function &amp;gt; Assign. Click and name the Assign “Host” and drag api_hostname to the assign.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WLWGnd27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/12.5-Assign-API.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WLWGnd27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/12.5-Assign-API.png" alt="" width="533" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the + to add another function and choose Compose, in Compose do a single Return in the compose field, name the output “Carriage Return.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d4RAu1TD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/13-Compose.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d4RAu1TD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/13-Compose.gif" alt="" width="880" height="811"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Replace function to URL encode our userEmail variable set it to Email Address variable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qGe-8BU4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/14-Replace-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qGe-8BU4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/14-Replace-1.gif" alt="" width="640" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Concatenate function text 1= “device=auto&amp;amp;factor=push&amp;amp;username=” text 2 is our Email Address Variable. Name the output of this “Body.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mR6WF4CA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/15-Body-5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mR6WF4CA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/15-Body-5.gif" alt="" width="640" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the Now Function to get the current Date &amp;amp; Time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pdt9BEDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/16-Now.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pdt9BEDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/16-Now.png" alt="" width="232" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add Date to Text function (Per Duo Auth API documentation)

&lt;ul&gt;
&lt;li&gt;Set Start to iso (from Now function)&lt;/li&gt;
&lt;li&gt;Format = “ddd, D MMM Y H:mm:ss Z”&lt;/li&gt;
&lt;li&gt;Zone = Africa/Abidjan&lt;/li&gt;
&lt;li&gt;Output = RFC 2822&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ghOnOqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/17-Date-to-Text.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ghOnOqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/17-Date-to-Text.gif" alt="" width="640" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create another Concatenate function where we will create the Signature Content to create our Encrypted Key

&lt;ul&gt;
&lt;li&gt;Date = RFC 2822 Variable (Set in Step 10)&lt;/li&gt;
&lt;li&gt;Carriage Return 1 = Carriage Return Variable&lt;/li&gt;
&lt;li&gt;Method = POST&lt;/li&gt;
&lt;li&gt;Carriage Return 2 = Carriage Return Variable&lt;/li&gt;
&lt;li&gt;Host = Host Variable (Set in Step 5)&lt;/li&gt;
&lt;li&gt;Carriage Return 3 = Carriage Return Variable&lt;/li&gt;
&lt;li&gt;Relative URL = /auth/v2/auth&lt;/li&gt;
&lt;li&gt;Carriage Return 4 = Carriage Return Variable&lt;/li&gt;
&lt;li&gt;Body = Body Variable (Set in Step 8)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gMr85Dm5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/Screen-Shot-2022-08-21-at-3.23.53-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gMr85Dm5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/Screen-Shot-2022-08-21-at-3.23.53-PM.png" alt="" width="236" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an HMAC function with the follow settings:

&lt;ul&gt;
&lt;li&gt;algorithm = sha1&lt;/li&gt;
&lt;li&gt;key = secret_key (obtained from the connector action)&lt;/li&gt;
&lt;li&gt;data = Signature Content (created in step 11)&lt;/li&gt;
&lt;li&gt;digest = hex&lt;/li&gt;
&lt;li&gt;Output = HMAC Output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--npdC43Ym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/19-HMAC.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--npdC43Ym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/19-HMAC.gif" alt="" width="640" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Concatenate function to build our username:password per Duo’s documentation.

&lt;ul&gt;
&lt;li&gt;text 1 = Integration Key (obtained from the connector action)&lt;/li&gt;
&lt;li&gt;text 2 = :&lt;/li&gt;
&lt;li&gt;HMAC Output = HMAC Output (Obtained from Step 12)&lt;/li&gt;
&lt;li&gt;Output = Auth&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QlNIT0ld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/20-Auth.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QlNIT0ld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/20-Auth.gif" alt="" width="640" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Base64 encoding of our Auth function and name it’s output “Token”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--86nvyR-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/21-Token.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--86nvyR-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/21-Token.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Concatenate function to build out the Basic Token for use later in our Header with the following options (Note, when typing “Basic ,” make sure you have a space at the end otherwise this will all fail.)

&lt;ul&gt;
&lt;li&gt;text 1 = Basic &lt;/li&gt;
&lt;li&gt;text 2 = Token&lt;/li&gt;
&lt;li&gt;output = Basic Token&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0lOx-FRA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/22-Basic-Token.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0lOx-FRA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/22-Basic-Token.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Length function to get the length of the token (required in our Header)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMsOZ5_X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/23-Length.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMsOZ5_X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/23-Length.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Construct function to build a Header as an Object. The name of each section matter as they create the Object as JSON.

&lt;ul&gt;
&lt;li&gt;Date = RFC 2822 (Created in Step 10)&lt;/li&gt;
&lt;li&gt;Authorization = Basic Token (Created in Step 15)&lt;/li&gt;
&lt;li&gt;Host = Host (Created in Step 5)&lt;/li&gt;
&lt;li&gt;Content-Length = length (Created in Step 16)&lt;/li&gt;
&lt;li&gt;Content-Type = application/x-www-form-urlencoded&lt;/li&gt;
&lt;li&gt;Output = Header&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9soHnrTW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/24-Construct-Date.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9soHnrTW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/24-Construct-Date.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Construct Part 1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WKjwwk7v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/25-Construct-Token-and-Host.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKjwwk7v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/25-Construct-Token-and-Host.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Construct Part 2&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HAOYgMwD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/26-Construct-final.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HAOYgMwD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/26-Construct-final.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Construct Part 3&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Concatenate to build our URL to call the API

&lt;ul&gt;
&lt;li&gt;text 1 = https://&lt;/li&gt;
&lt;li&gt;text 2 – Host (Created in Step 5)&lt;/li&gt;
&lt;li&gt;Relative URL = /auth/v2/auth&lt;/li&gt;
&lt;li&gt;output = Call URL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z7v6mEXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/27-Call-URL.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z7v6mEXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/27-Call-URL.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Raw Request – this calls Duo and prompts the user with a Duo push

&lt;ul&gt;
&lt;li&gt;url = Call URL (Created in Step 18)&lt;/li&gt;
&lt;li&gt;method = POST&lt;/li&gt;
&lt;li&gt;headers = Header (Created in Step 17)&lt;/li&gt;
&lt;li&gt;query = {}&lt;/li&gt;
&lt;li&gt;body = Body (Created in Step 8)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LqVbFpBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/28-Raw-Request.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LqVbFpBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/28-Raw-Request.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;JSON Parse to get a clean version of the body returned so we can act on the Results of the push.

&lt;ul&gt;
&lt;li&gt;string = body (Output of the HTTP Raw Request)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vfh6Cp92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/29-Parse.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vfh6Cp92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/29-Parse.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Object Get Multiple which pulls out the result, status, and status message

&lt;ul&gt;
&lt;li&gt;object = output (Created in Step 20)&lt;/li&gt;
&lt;li&gt;response.result&lt;/li&gt;
&lt;li&gt;response.status&lt;/li&gt;
&lt;li&gt;response.status_msg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--80ZTElGT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/30-Get-Multiple.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--80ZTElGT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/30-Get-Multiple.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Return Outputs

&lt;ul&gt;
&lt;li&gt;Result = response.result (Created in Step 21)&lt;/li&gt;
&lt;li&gt;Status = response.status (Created in Step 21)&lt;/li&gt;
&lt;li&gt;Status Message = response.status_msg (Created in Step 21)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aFA-eZXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/31-Create-the-Result.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aFA-eZXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/31-Create-the-Result.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating the results&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gAvA9YeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/32-Results.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gAvA9YeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/32-Results.gif" alt="" width="640" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Adding the Variables&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We have the structure now to prompt a user with Duo. We still need to build out the Duo Auth API and our Connector Authping. Since we need the keys and hostname to use/test authping, we’ll create that now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Duo Application API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to Duo&lt;/li&gt;
&lt;li&gt;Click Applications on left hand side&lt;/li&gt;
&lt;li&gt;Click Protect an Application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--amtEf7bZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Protect-Application.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--amtEf7bZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Protect-Application.png" alt="" width="187" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filter by keyword: Auth API and Choose Protect &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--36ey-Jmg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Auth-Pick.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--36ey-Jmg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Auth-Pick.gif" alt="" width="640" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scroll to the bottom of the Auth API and change the name to whatever action you’d like the user to see/understand. We have an app call Locksmith and call the Duo Auth API that’s used to Prompt, Locksmith, so the user knows that was the application prompting them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XL6gbjEo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Naming.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XL6gbjEo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Naming.gif" alt="" width="640" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep this page open to use later. We’ll need the contents of Integration Key, Secret key, and API hostname.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Creating Authping Flow
&lt;/h2&gt;

&lt;p&gt;This flow is used to determine if the Duo Auth service is up. Ideally we’d use the &lt;a href="https://duo.com/docs/authapi#/check"&gt;/check&lt;/a&gt; endpoint of the Duo Auth API to validate credentials but I’ve been unable to get that to work, we are working with Duo to try to figure out the issue. For now, we’ll build with the &lt;a href="https://duo.com/docs/authapi#/ping"&gt;/ping&lt;/a&gt; endpoint.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login to Connector Builder and click on the Duo Auth Connector&lt;/li&gt;
&lt;li&gt;Click the Flows Tab&lt;/li&gt;
&lt;li&gt;Click Duplicate our Prompt Flow so we can use the structure and tweak for /ping. Let’s also set the name to Ping.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oWHwApo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1.1-Duplicate.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oWHwApo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1.1-Duplicate.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First Change is to change the action, by deleting the current one and enabling Authping.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uQHmyJA3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Change-Event.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uQHmyJA3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Change-Event.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let’s update our variables that we changed/killed when we removed the original action. We’ll need to update the integration_key, secret_key, and api_hostname. See the following gifs for changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6xeVUShd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5-integration-key.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6xeVUShd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5-integration-key.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f9CKdDy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Secret-Key.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f9CKdDy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Secret-Key.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Updating Secret Key&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mYUXVvEF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Update-api-hostname.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mYUXVvEF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Update-api-hostname.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Update API Hostname&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We need to update our Signature Content to fit the /ping GET requirement. The Concatenate function should be as follows, note the double carriage returns at the end, this is required per &lt;a href="https://duo.com/docs/authapi#authentication"&gt;Duo’s documentation&lt;/a&gt; see GET request require section:

&lt;ul&gt;
&lt;li&gt;Date = RFC 2822&lt;/li&gt;
&lt;li&gt;Carriage Return 1 = Carriage Return&lt;/li&gt;
&lt;li&gt;Method = Get&lt;/li&gt;
&lt;li&gt;Carriage Return 2 = Carriage Return&lt;/li&gt;
&lt;li&gt;Host = Host&lt;/li&gt;
&lt;li&gt;Carriage Return 3 = Carriage Return&lt;/li&gt;
&lt;li&gt;Relative URL = /auth/v2/ping&lt;/li&gt;
&lt;li&gt;Carriage Return 4 = Carriage Return&lt;/li&gt;
&lt;li&gt;Carriage Return 5 = Carriage Return&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nKYkIb08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6-Update-Sig.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nKYkIb08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6-Update-Sig.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v0rLAwp_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6.1-Update-sig.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v0rLAwp_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6.1-Update-sig.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We now need to clean update our Construct, we won’t be sending a body as /ping doesn’t require parameters so the length is now 0. If you want to be really clean, you can remove the Length function all together, for the purposes of this, I’m not going to.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_1V-tkwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7-Length.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_1V-tkwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7-Length.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We need to change the relative URL in our Call URL from /auth/v2/auth to /auth/v2/ping. remove the body from the Raw Request and Change the Method to GET (Changing Method is not in the gif below.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tfyzF50t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/8-Call-URL-Clean.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tfyzF50t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/8-Call-URL-Clean.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We can remove the Parse and Get Multiple functions as this only returns true or false and there can return true if it works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0oyfpCIy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/9-Return.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0oyfpCIy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/9-Return.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now let’s test our Authping, click test and create a Connector using the integration key, secret key, and api hostname from the Duo Auth API we created earlier. Click Save then Test and create your Connection, give it a nickname and copy/paste the required credentials.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e2QkgW38--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/10-Testor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e2QkgW38--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/10-Testor.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--htDdPvlp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/10.1-Testor-2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--htDdPvlp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/10.1-Testor-2.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IYJGgt1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/11-Success.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IYJGgt1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/11-Success.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authping works! Now we can put it all together and prompt for Duo Auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Prompt
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the Flows tab and turn on Prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7xCmCpzQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Turn-on-prompt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7xCmCpzQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Turn-on-prompt.gif" alt="" width="640" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click into Prompt and click Test, enter your email address to receive a test prompt. Depending on your response you will see a result of “allow” or “deny” and can act on those accordingly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Branding our Connector
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the Overview Tab, find Settings and click “Edit”

&lt;ul&gt;
&lt;li&gt;Here we can brand our connector as if it was direct from Duo.&lt;/li&gt;
&lt;li&gt;Here is Duo’s Brand guidelines if you want the exact colors: &lt;a href="https://brandfolder.com/duo"&gt;https://brandfolder.com/duo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;First we’ll update the color&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NZYxm_E---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Duo-Color.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NZYxm_E---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/3-Duo-Color.gif" alt="" width="640" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next find a logo you’d like to use with the connector and click the upload button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4GQQ2SHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Duo-Logo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4GQQ2SHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/4-Duo-Logo.gif" alt="" width="640" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you want to post Duo Auth API documentation you can add that to User Documentation URL, then Click Save.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploying our Connector
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Get back to the root of the connector folder and click on the Deployment tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z17NA_SQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Deployment-Tab.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z17NA_SQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/1-Deployment-Tab.gif" alt="" width="640" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the “Validate Connector” button. Then click Done.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wu5C5LaJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Validate-1024x656.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wu5C5LaJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/2-Validate-1024x656.png" alt="" width="880" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you wanna let everyone know this connector is still in testing, just “Deploy test version” otherwise “Deploy local connector” for now we’ll deploy a test version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DVDwdVp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5-Deploy-Test.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DVDwdVp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/5-Deploy-Test.gif" alt="" width="640" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing our Connector in Workflows
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to Workflows or click the Workflows home button&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7RaEwppX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6-Workflows-home.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7RaEwppX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/6-Workflows-home.png" alt="" width="145" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the workflow you’d like to use the connector with or open a new workflow and “Add app action” search for duo and click “Include test connectors” check box if you only deployed a test version. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G6JI7uzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7-Add-app-action.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G6JI7uzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://testing12.org/wp-content/uploads/2022/08/7-Add-app-action.gif" alt="" width="640" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click on your Duo Auth Connector and click “Prompt” we can then setup our connection in Workflows, you can use the same keys and hostname that you previously used to test or create new ones to match the name of the Workflow. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_DqSkigj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" width="72" height="72"&gt; – Remember to Name the connection nickname what you named the Duo Auth API so that it’s easy to know what’s being used&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After setting up the connection click Test and you’re on your way, I’d suggest using an If/Else function after to act on “allow” or “deny”&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>oktaworkflows</category>
      <category>duo</category>
    </item>
  </channel>
</rss>
