I am using a PowerShell script to attempt to sync a user to a directory. I am getting back a
{"code": 40401, "message": "Resource not found", "message_detail": "Directory not found", "stat": "FAIL"}
Generally when I modify the script I’m getting an “code”: 40401, “message”: “Resource not found”
This makes me believe its an Auth issue still
I Am able to successfully get /auth/v2/check to work however
function New-DuoRequest(){
param(
[Parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$apiHost,
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[ValidateNotNull()]
$apiEndpoint,
[Parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$apiKey,
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[ValidateNotNull()]
$apiSecret,
[Parameter(Mandatory=$false,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[ValidateNotNull()]
$requestMethod = 'GET',
[Parameter(Mandatory=$false,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[ValidateNotNull()]
[System.Collections.Hashtable]$requestParams
)
$date = (Get-Date).ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss -0000")
$formattedParams = ($requestParams.Keys | Sort-Object | ForEach-Object {$_ + "=" + [uri]::EscapeDataString($requestParams.$_)}) -join "&"
#DUO Params formatted and stored as bytes with StringAPIParams
$requestToSign = (@(
$Date.Trim(),
$requestMethod.ToUpper().Trim(),
$apiHost.ToLower().Trim(),
$apiEndpoint.Trim(),
$formattedParams
).trim() -join "`n").ToCharArray().ToByte([System.IFormatProvider]$UTF8)
$hmacsha1 = [System.Security.Cryptography.HMACSHA1]::new($apiSecret.ToCharArray().ToByte([System.IFormatProvider]$UTF8))
$hmacsha1.ComputeHash($requestToSign) | Out-Null
$authSignature = [System.BitConverter]::ToString($hmacsha1.Hash).Replace("-", "").ToLower()
$authHeader = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(('{0}:{1}' -f $apiKey, $authSignature)))
$httpRequest = @{
URI = ('https://{0}{1}' -f $apiHost, $apiEndpoint)
Headers = @{
"X-Duo-Date" = $Date
"Authorization" = "Basic $authHeader"
}
Body = $requestParams
Method = $requestMethod
ContentType = 'application/x-www-form-urlencoded'
}
$httpRequest
}
# Calling the function
$values = @{
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■'
apiEndpoint = '/admin/v1/users/directorysync/DIRECOTRYKEY/syncuser'
requestMethod = 'POST'
requestParams = @{username="JDOE"}
apiSecret = 'SECRETKEY'
apiKey = 'IKEY'
}
$contructWebRequest = New-DuoRequest @values
# Send the request
$wr = Invoke-WebRequest @contructWebRequest
$wr