<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Duo enroll user Rest Api Call java in APIs</title>
    <link>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4933870#M725</link>
    <description>&lt;P&gt;&lt;STRONG&gt;I have use below like which is working fine:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;1. Add below dependency to pom.xml'&lt;/P&gt;&lt;PRE&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.duosecurity&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;duo-client&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;&lt;SPAN class=""&gt;0.6&lt;/SPAN&gt;&lt;SPAN class=""&gt;.0&lt;/SPAN&gt;&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/PRE&gt;&lt;P&gt;2. User below code:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.HttpEntity;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.HttpResponse;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.client.HttpClient;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.client.methods.HttpPost;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.impl.client.HttpClients;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.util.EntityUtils;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;javax.crypto.Mac;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;javax.crypto.spec.SecretKeySpec;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.io.IOException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.io.UnsupportedEncodingException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.net.URLEncoder;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.InvalidKeyException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.NoSuchAlgorithmException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.time.OffsetDateTime;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.time.format.DateTimeFormatter;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.ArrayList;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.Base64;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.SortedMap;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.TreeMap;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;public class &lt;/SPAN&gt;AdminAPIExample {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private static &lt;/SPAN&gt;SortedMap&amp;lt;String, Object&amp;gt; &lt;SPAN&gt;params &lt;/SPAN&gt;= &lt;SPAN&gt;new &lt;/SPAN&gt;TreeMap&amp;lt;String, Object&amp;gt;();&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static void &lt;/SPAN&gt;&lt;SPAN&gt;main&lt;/SPAN&gt;(String[] args) &lt;SPAN&gt;throws &lt;/SPAN&gt;IOException {&lt;BR /&gt;        String ikey = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String skey = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String host = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String httpMethod = &lt;SPAN&gt;"POST"&lt;/SPAN&gt;;&lt;BR /&gt;        String requestPath = &lt;SPAN&gt;"/auth/v2/auth"&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;        String timestamp = OffsetDateTime.&lt;SPAN&gt;now&lt;/SPAN&gt;().format(DateTimeFormatter.&lt;SPAN&gt;RFC_1123_DATE_TIME&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"username"&lt;/SPAN&gt;,&lt;SPAN&gt;"20230612"&lt;/SPAN&gt;);&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"factor"&lt;/SPAN&gt;,&lt;SPAN&gt;"push"&lt;/SPAN&gt;);&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"device"&lt;/SPAN&gt;,&lt;SPAN&gt;"auto"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;        String queryString = &lt;SPAN&gt;canonQueryString&lt;/SPAN&gt;();&lt;BR /&gt;       System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"queryString = " &lt;/SPAN&gt;+ queryString);&lt;BR /&gt;      &lt;SPAN&gt;//  System.out.println("queryString = " +params.size());&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        String canonicalRequest = timestamp +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ httpMethod.toUpperCase() +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ host.toLowerCase() +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;+requestPath +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+queryString;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"canonicalRequest = " &lt;/SPAN&gt;+ canonicalRequest);&lt;BR /&gt;&lt;BR /&gt;        String signature = &lt;SPAN&gt;sign2&lt;/SPAN&gt;(canonicalRequest, skey);&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"signature = " &lt;/SPAN&gt;+ signature);&lt;BR /&gt;&lt;BR /&gt;        String url = &lt;SPAN&gt;"https://" &lt;/SPAN&gt;+ host.toLowerCase() + requestPath+&lt;SPAN&gt;"?"&lt;/SPAN&gt;+queryString;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"url = " &lt;/SPAN&gt;+ url);&lt;BR /&gt;&lt;BR /&gt;        String authString =&lt;SPAN&gt;"Basic "&lt;/SPAN&gt;+ Base64.&lt;SPAN&gt;getEncoder&lt;/SPAN&gt;().encodeToString((ikey + &lt;SPAN&gt;":" &lt;/SPAN&gt;+ signature).getBytes());&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"authString = " &lt;/SPAN&gt;+ authString);&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"authString length= " &lt;/SPAN&gt;+ authString.length());&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;        HttpClient httpClient = HttpClients.&lt;SPAN&gt;createDefault&lt;/SPAN&gt;();&lt;BR /&gt;        HttpPost httpPost = &lt;SPAN&gt;new &lt;/SPAN&gt;HttpPost(url);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Date"&lt;/SPAN&gt;, timestamp);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Authorization"&lt;/SPAN&gt;, authString);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Host"&lt;/SPAN&gt;, host.toLowerCase());&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Content-Type"&lt;/SPAN&gt;, &lt;SPAN&gt;"application/x-www-form-urlencoded"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;// Make the request&lt;BR /&gt;&lt;/SPAN&gt;        HttpResponse response = httpClient.execute(httpPost);&lt;BR /&gt;        HttpEntity entity = response.getEntity();&lt;BR /&gt;        String responseContent = entity != &lt;SPAN&gt;null &lt;/SPAN&gt;? EntityUtils.&lt;SPAN&gt;toString&lt;/SPAN&gt;(entity) : &lt;SPAN&gt;""&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;        String rs =  &lt;SPAN&gt;"Response Status Code: " &lt;/SPAN&gt;+ response.getStatusLine().getStatusCode() + &lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;Response Content:&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ responseContent;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"rs = " &lt;/SPAN&gt;+ rs);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;canonQueryString&lt;/SPAN&gt;()&lt;BR /&gt;            &lt;SPAN&gt;throws &lt;/SPAN&gt;UnsupportedEncodingException {&lt;BR /&gt;        ArrayList&amp;lt;String&amp;gt; args = &lt;SPAN&gt;new &lt;/SPAN&gt;ArrayList&amp;lt;String&amp;gt;();&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(String key : &lt;SPAN&gt;params&lt;/SPAN&gt;.keySet()) {&lt;BR /&gt;            String name = URLEncoder&lt;BR /&gt;                    .&lt;SPAN&gt;encode&lt;/SPAN&gt;(key, &lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"+"&lt;/SPAN&gt;, &lt;SPAN&gt;"%20"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"*"&lt;/SPAN&gt;, &lt;SPAN&gt;"%2A"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"%7E"&lt;/SPAN&gt;, &lt;SPAN&gt;"~"&lt;/SPAN&gt;);&lt;BR /&gt;            String value = URLEncoder&lt;BR /&gt;                    .&lt;SPAN&gt;encode&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt;.get(key).toString(), &lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"+"&lt;/SPAN&gt;, &lt;SPAN&gt;"%20"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"*"&lt;/SPAN&gt;, &lt;SPAN&gt;"%2A"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"%7E"&lt;/SPAN&gt;, &lt;SPAN&gt;"~"&lt;/SPAN&gt;);&lt;BR /&gt;            args.add(name + &lt;SPAN&gt;"=" &lt;/SPAN&gt;+ value);&lt;BR /&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;com.duosecurity.client.Util.&lt;SPAN&gt;join&lt;/SPAN&gt;(args.toArray(), &lt;SPAN&gt;"&amp;amp;"&lt;/SPAN&gt;);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private static &lt;/SPAN&gt;String &lt;SPAN&gt;bytesToHex&lt;/SPAN&gt;(&lt;SPAN&gt;byte&lt;/SPAN&gt;[] bytes) {&lt;BR /&gt;        StringBuilder hexStringBuilder = &lt;SPAN&gt;new &lt;/SPAN&gt;StringBuilder();&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(&lt;SPAN&gt;byte &lt;/SPAN&gt;b : bytes) {&lt;BR /&gt;            hexStringBuilder.append(String.&lt;SPAN&gt;format&lt;/SPAN&gt;(&lt;SPAN&gt;"%02x"&lt;/SPAN&gt;, b));&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;hexStringBuilder.toString();&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;static &lt;/SPAN&gt;String &lt;SPAN&gt;sign2&lt;/SPAN&gt;(String data, String secretKey){&lt;BR /&gt;        &lt;SPAN&gt;try &lt;/SPAN&gt;{&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] secretKeyBytes = secretKey.getBytes(&lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;);&lt;BR /&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] messageBytes = data.getBytes(&lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Create a secret key specification&lt;BR /&gt;&lt;/SPAN&gt;            SecretKeySpec secretKeySpec = &lt;SPAN&gt;new &lt;/SPAN&gt;SecretKeySpec(secretKeyBytes, &lt;SPAN&gt;"HmacSHA1"&lt;/SPAN&gt;); &lt;SPAN&gt;// Use a suitable HMAC algorithm&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;            // Initialize the HMAC with the secret key&lt;BR /&gt;&lt;/SPAN&gt;            Mac mac = Mac.&lt;SPAN&gt;getInstance&lt;/SPAN&gt;(&lt;SPAN&gt;"HmacSHA1"&lt;/SPAN&gt;); &lt;SPAN&gt;// Use the same HMAC algorithm&lt;BR /&gt;&lt;/SPAN&gt;            mac.init(secretKeySpec);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Calculate the HMAC&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] hmacBytes = mac.doFinal(messageBytes);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Convert the HMAC to a hexadecimal string&lt;BR /&gt;&lt;/SPAN&gt;            StringBuilder hexStringBuilder = &lt;SPAN&gt;new &lt;/SPAN&gt;StringBuilder();&lt;BR /&gt;            &lt;SPAN&gt;for &lt;/SPAN&gt;(&lt;SPAN&gt;byte &lt;/SPAN&gt;b : hmacBytes) {&lt;BR /&gt;                hexStringBuilder.append(String.&lt;SPAN&gt;format&lt;/SPAN&gt;(&lt;SPAN&gt;"%02x"&lt;/SPAN&gt;, b));&lt;BR /&gt;            }&lt;BR /&gt;            String hexHMAC = hexStringBuilder.toString();&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Print the hex HMAC&lt;BR /&gt;&lt;/SPAN&gt;            System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(hexHMAC);&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;return &lt;/SPAN&gt;hexHMAC;&lt;BR /&gt;        } &lt;SPAN&gt;catch &lt;/SPAN&gt;(NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {&lt;BR /&gt;            e.printStackTrace();&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return null&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;P&gt;Note: All Other API are similar. &lt;STRONG&gt;Just change your intregation key, Secrete key, host, end point and parameters.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Check here: &lt;A href="https://duo.com/docs/authapi#endpoints" target="_self"&gt;Admin API&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 04 Oct 2023 07:09:04 GMT</pubDate>
    <dc:creator>enamul-haque</dc:creator>
    <dc:date>2023-10-04T07:09:04Z</dc:date>
    <item>
      <title>Duo enroll user Rest Api Call java</title>
      <link>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4898205#M695</link>
      <description>&lt;P&gt;I want to enroll the user for duo authentication while I create a new user in my application. Is there any java client available which can be used for enrolling the user to DUO&lt;/P&gt;</description>
      <pubDate>Thu, 03 Aug 2023 12:16:20 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4898205#M695</guid>
      <dc:creator>gauravagarwal3371</dc:creator>
      <dc:date>2023-08-03T12:16:20Z</dc:date>
    </item>
    <item>
      <title>Re: Duo enroll user Rest Api Call java</title>
      <link>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4901626#M696</link>
      <description>&lt;P&gt;You can use the Admin API examples in &lt;A href="https://github.com/duosecurity/duo_client_java" target="_blank"&gt;https://github.com/duosecurity/duo_client_java&lt;/A&gt;&amp;nbsp;to figure out how to call the Auth API enroll endpoint&amp;nbsp;&lt;A href="https://duo.com/docs/authapi#/enroll" target="_blank"&gt;https://duo.com/docs/authapi#/enroll&lt;/A&gt;&amp;nbsp;or make use of the enroll response received by the preauth endpoint&amp;nbsp;&lt;A href="https://duo.com/docs/authapi#/preauth" target="_blank"&gt;https://duo.com/docs/authapi#/preauth&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;If your application is able to render a web page for authentication consider using our WebSDK instead, which will handle user enrollment for you.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://duo.com/docs/duoweb" target="_blank"&gt;https://duo.com/docs/duoweb&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/duosecurity/duo_universal_java" target="_blank"&gt;https://github.com/duosecurity/duo_universal_java&lt;/A&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 08 Aug 2023 12:10:01 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4901626#M696</guid>
      <dc:creator>DuoKristina</dc:creator>
      <dc:date>2023-08-08T12:10:01Z</dc:date>
    </item>
    <item>
      <title>Re: Duo enroll user Rest Api Call java</title>
      <link>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4901729#M697</link>
      <description>&lt;P&gt;How to do http authentication in java? It is throwing Access forbidden error&lt;/P&gt;</description>
      <pubDate>Tue, 08 Aug 2023 15:02:09 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4901729#M697</guid>
      <dc:creator>gauravagarwal3371</dc:creator>
      <dc:date>2023-08-08T15:02:09Z</dc:date>
    </item>
    <item>
      <title>Re: Duo enroll user Rest Api Call java</title>
      <link>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4933870#M725</link>
      <description>&lt;P&gt;&lt;STRONG&gt;I have use below like which is working fine:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;1. Add below dependency to pom.xml'&lt;/P&gt;&lt;PRE&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.duosecurity&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;duo-client&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;&lt;SPAN class=""&gt;0.6&lt;/SPAN&gt;&lt;SPAN class=""&gt;.0&lt;/SPAN&gt;&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/PRE&gt;&lt;P&gt;2. User below code:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.HttpEntity;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.HttpResponse;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.client.HttpClient;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.client.methods.HttpPost;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.impl.client.HttpClients;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;org.apache.http.util.EntityUtils;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;javax.crypto.Mac;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;javax.crypto.spec.SecretKeySpec;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.io.IOException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.io.UnsupportedEncodingException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.net.URLEncoder;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.InvalidKeyException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.NoSuchAlgorithmException;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.time.OffsetDateTime;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.time.format.DateTimeFormatter;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.ArrayList;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.Base64;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.SortedMap;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.TreeMap;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;public class &lt;/SPAN&gt;AdminAPIExample {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private static &lt;/SPAN&gt;SortedMap&amp;lt;String, Object&amp;gt; &lt;SPAN&gt;params &lt;/SPAN&gt;= &lt;SPAN&gt;new &lt;/SPAN&gt;TreeMap&amp;lt;String, Object&amp;gt;();&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static void &lt;/SPAN&gt;&lt;SPAN&gt;main&lt;/SPAN&gt;(String[] args) &lt;SPAN&gt;throws &lt;/SPAN&gt;IOException {&lt;BR /&gt;        String ikey = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String skey = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String host = &lt;SPAN&gt;"x"&lt;/SPAN&gt;;&lt;BR /&gt;        String httpMethod = &lt;SPAN&gt;"POST"&lt;/SPAN&gt;;&lt;BR /&gt;        String requestPath = &lt;SPAN&gt;"/auth/v2/auth"&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;        String timestamp = OffsetDateTime.&lt;SPAN&gt;now&lt;/SPAN&gt;().format(DateTimeFormatter.&lt;SPAN&gt;RFC_1123_DATE_TIME&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"username"&lt;/SPAN&gt;,&lt;SPAN&gt;"20230612"&lt;/SPAN&gt;);&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"factor"&lt;/SPAN&gt;,&lt;SPAN&gt;"push"&lt;/SPAN&gt;);&lt;BR /&gt;        &lt;SPAN&gt;params&lt;/SPAN&gt;.put(&lt;SPAN&gt;"device"&lt;/SPAN&gt;,&lt;SPAN&gt;"auto"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;        String queryString = &lt;SPAN&gt;canonQueryString&lt;/SPAN&gt;();&lt;BR /&gt;       System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"queryString = " &lt;/SPAN&gt;+ queryString);&lt;BR /&gt;      &lt;SPAN&gt;//  System.out.println("queryString = " +params.size());&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        String canonicalRequest = timestamp +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ httpMethod.toUpperCase() +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ host.toLowerCase() +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;+requestPath +&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+queryString;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"canonicalRequest = " &lt;/SPAN&gt;+ canonicalRequest);&lt;BR /&gt;&lt;BR /&gt;        String signature = &lt;SPAN&gt;sign2&lt;/SPAN&gt;(canonicalRequest, skey);&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"signature = " &lt;/SPAN&gt;+ signature);&lt;BR /&gt;&lt;BR /&gt;        String url = &lt;SPAN&gt;"https://" &lt;/SPAN&gt;+ host.toLowerCase() + requestPath+&lt;SPAN&gt;"?"&lt;/SPAN&gt;+queryString;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"url = " &lt;/SPAN&gt;+ url);&lt;BR /&gt;&lt;BR /&gt;        String authString =&lt;SPAN&gt;"Basic "&lt;/SPAN&gt;+ Base64.&lt;SPAN&gt;getEncoder&lt;/SPAN&gt;().encodeToString((ikey + &lt;SPAN&gt;":" &lt;/SPAN&gt;+ signature).getBytes());&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"authString = " &lt;/SPAN&gt;+ authString);&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"authString length= " &lt;/SPAN&gt;+ authString.length());&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;        HttpClient httpClient = HttpClients.&lt;SPAN&gt;createDefault&lt;/SPAN&gt;();&lt;BR /&gt;        HttpPost httpPost = &lt;SPAN&gt;new &lt;/SPAN&gt;HttpPost(url);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Date"&lt;/SPAN&gt;, timestamp);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Authorization"&lt;/SPAN&gt;, authString);&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Host"&lt;/SPAN&gt;, host.toLowerCase());&lt;BR /&gt;        httpPost.setHeader(&lt;SPAN&gt;"Content-Type"&lt;/SPAN&gt;, &lt;SPAN&gt;"application/x-www-form-urlencoded"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;// Make the request&lt;BR /&gt;&lt;/SPAN&gt;        HttpResponse response = httpClient.execute(httpPost);&lt;BR /&gt;        HttpEntity entity = response.getEntity();&lt;BR /&gt;        String responseContent = entity != &lt;SPAN&gt;null &lt;/SPAN&gt;? EntityUtils.&lt;SPAN&gt;toString&lt;/SPAN&gt;(entity) : &lt;SPAN&gt;""&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;        String rs =  &lt;SPAN&gt;"Response Status Code: " &lt;/SPAN&gt;+ response.getStatusLine().getStatusCode() + &lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;Response Content:&lt;/SPAN&gt;&lt;SPAN&gt;\n&lt;/SPAN&gt;&lt;SPAN&gt;" &lt;/SPAN&gt;+ responseContent;&lt;BR /&gt;        System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(&lt;SPAN&gt;"rs = " &lt;/SPAN&gt;+ rs);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;canonQueryString&lt;/SPAN&gt;()&lt;BR /&gt;            &lt;SPAN&gt;throws &lt;/SPAN&gt;UnsupportedEncodingException {&lt;BR /&gt;        ArrayList&amp;lt;String&amp;gt; args = &lt;SPAN&gt;new &lt;/SPAN&gt;ArrayList&amp;lt;String&amp;gt;();&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(String key : &lt;SPAN&gt;params&lt;/SPAN&gt;.keySet()) {&lt;BR /&gt;            String name = URLEncoder&lt;BR /&gt;                    .&lt;SPAN&gt;encode&lt;/SPAN&gt;(key, &lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"+"&lt;/SPAN&gt;, &lt;SPAN&gt;"%20"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"*"&lt;/SPAN&gt;, &lt;SPAN&gt;"%2A"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"%7E"&lt;/SPAN&gt;, &lt;SPAN&gt;"~"&lt;/SPAN&gt;);&lt;BR /&gt;            String value = URLEncoder&lt;BR /&gt;                    .&lt;SPAN&gt;encode&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt;.get(key).toString(), &lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"+"&lt;/SPAN&gt;, &lt;SPAN&gt;"%20"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"*"&lt;/SPAN&gt;, &lt;SPAN&gt;"%2A"&lt;/SPAN&gt;)&lt;BR /&gt;                    .replace(&lt;SPAN&gt;"%7E"&lt;/SPAN&gt;, &lt;SPAN&gt;"~"&lt;/SPAN&gt;);&lt;BR /&gt;            args.add(name + &lt;SPAN&gt;"=" &lt;/SPAN&gt;+ value);&lt;BR /&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;com.duosecurity.client.Util.&lt;SPAN&gt;join&lt;/SPAN&gt;(args.toArray(), &lt;SPAN&gt;"&amp;amp;"&lt;/SPAN&gt;);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private static &lt;/SPAN&gt;String &lt;SPAN&gt;bytesToHex&lt;/SPAN&gt;(&lt;SPAN&gt;byte&lt;/SPAN&gt;[] bytes) {&lt;BR /&gt;        StringBuilder hexStringBuilder = &lt;SPAN&gt;new &lt;/SPAN&gt;StringBuilder();&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(&lt;SPAN&gt;byte &lt;/SPAN&gt;b : bytes) {&lt;BR /&gt;            hexStringBuilder.append(String.&lt;SPAN&gt;format&lt;/SPAN&gt;(&lt;SPAN&gt;"%02x"&lt;/SPAN&gt;, b));&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;hexStringBuilder.toString();&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;static &lt;/SPAN&gt;String &lt;SPAN&gt;sign2&lt;/SPAN&gt;(String data, String secretKey){&lt;BR /&gt;        &lt;SPAN&gt;try &lt;/SPAN&gt;{&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] secretKeyBytes = secretKey.getBytes(&lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;);&lt;BR /&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] messageBytes = data.getBytes(&lt;SPAN&gt;"UTF-8"&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Create a secret key specification&lt;BR /&gt;&lt;/SPAN&gt;            SecretKeySpec secretKeySpec = &lt;SPAN&gt;new &lt;/SPAN&gt;SecretKeySpec(secretKeyBytes, &lt;SPAN&gt;"HmacSHA1"&lt;/SPAN&gt;); &lt;SPAN&gt;// Use a suitable HMAC algorithm&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;            // Initialize the HMAC with the secret key&lt;BR /&gt;&lt;/SPAN&gt;            Mac mac = Mac.&lt;SPAN&gt;getInstance&lt;/SPAN&gt;(&lt;SPAN&gt;"HmacSHA1"&lt;/SPAN&gt;); &lt;SPAN&gt;// Use the same HMAC algorithm&lt;BR /&gt;&lt;/SPAN&gt;            mac.init(secretKeySpec);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Calculate the HMAC&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;byte&lt;/SPAN&gt;[] hmacBytes = mac.doFinal(messageBytes);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Convert the HMAC to a hexadecimal string&lt;BR /&gt;&lt;/SPAN&gt;            StringBuilder hexStringBuilder = &lt;SPAN&gt;new &lt;/SPAN&gt;StringBuilder();&lt;BR /&gt;            &lt;SPAN&gt;for &lt;/SPAN&gt;(&lt;SPAN&gt;byte &lt;/SPAN&gt;b : hmacBytes) {&lt;BR /&gt;                hexStringBuilder.append(String.&lt;SPAN&gt;format&lt;/SPAN&gt;(&lt;SPAN&gt;"%02x"&lt;/SPAN&gt;, b));&lt;BR /&gt;            }&lt;BR /&gt;            String hexHMAC = hexStringBuilder.toString();&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;// Print the hex HMAC&lt;BR /&gt;&lt;/SPAN&gt;            System.&lt;SPAN&gt;out&lt;/SPAN&gt;.println(hexHMAC);&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;return &lt;/SPAN&gt;hexHMAC;&lt;BR /&gt;        } &lt;SPAN&gt;catch &lt;/SPAN&gt;(NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {&lt;BR /&gt;            e.printStackTrace();&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return null&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;P&gt;Note: All Other API are similar. &lt;STRONG&gt;Just change your intregation key, Secrete key, host, end point and parameters.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Check here: &lt;A href="https://duo.com/docs/authapi#endpoints" target="_self"&gt;Admin API&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Oct 2023 07:09:04 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-enroll-user-rest-api-call-java/m-p/4933870#M725</guid>
      <dc:creator>enamul-haque</dc:creator>
      <dc:date>2023-10-04T07:09:04Z</dc:date>
    </item>
  </channel>
</rss>

