Invoke-RestMethod de PowerShell equivalente a curl -u (Autenticación básica)

¿Cuál es el equivalente de

curl -u username:password ... 

en Invoke-RestMethod ? Intenté esto:

 $securePwd = ConvertTo-SecureString "password" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd) Invoke-RestMethod -Credential $credential ... 

pero devuelve 401, no autorizado.

Este es el único método que funcionó para mí hasta ahora:

 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password))) Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ... 

Pero no creo que no haya una mejor manera.

No estoy seguro de por qué el parámetro -Credential no funciona en su caso, pero funciona con el servicio httpbin .

Puedes intentar esto:

 $pwd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force $cred = New-Object Management.Automation.PSCredential ('PsUser', $pwd) Invoke-RestMethod 'http://httpbin.org/basic-auth/PsUser/MyPassword' -cred $cred 

Editar: como se indica en los comentarios, este método no enviará el encabezado Autorización en la solicitud inicial. Espera una respuesta de desafío y luego reenvía la solicitud con el encabezado de Autorización. Esto no funcionará para los servicios que requieren credenciales en la solicitud inicial.

Parece que debes combinar métodos cuando fallan de forma independiente.

Crea la credencial y agrégala a la solicitud.

Crea el encabezado y agrégalo a la solicitud.

 $username = "username"; $password = ConvertTo-SecureString –String "password" –AsPlainText -Force $credential = New-Object –TypeName "System.Management.Automation.PSCredential" –ArgumentList $username, $password $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password))) $getProjectUri = "yourUri" Invoke-RestMethod -Method Get -Uri $getProjectUri -Headers @{Authorization = "Basic $base64AuthInfo" } -Credential $credential -ContentType "application/json" 

Esta versión funciona con el objeto PSCredential Get-Credential . También funciona multiplataforma en PowerShell 6.0. Lo hace evitando el uso de llamadas BSTR, que a veces se sugieren al intentar extraer la contraseña de PSCredential .

 $creds = Get-Credential $unsecureCreds = $creds.GetNetworkCredential() $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $unsecureCreds.UserName,$unsecureCreds.Password))) Remove-Variable unsecureCreds Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ... 

Descubrí que el uso del parámetro -WebSession funciona si crea previamente un objeto WebRequestSession con credenciales. No voy a repetir cómo crear un objeto de Credencial de PS, ya que eso ya se ha cubierto en otras respuestas.

 $WebSession = New-Object -TypeName Microsoft.PowerShell.Commands.WebRequestSession -Property @{Credentials=$Credential} Invoke-RestMethod -Uri "your_URI" -WebSession $WebSession 

Este enfoque envía el encabezado de autenticación en la primera llamada, por lo que evita la respuesta 401.

Dicho sea de paso, este enfoque también se puede usar para establecer detalles de proxy (que no funcionan correctamente en todas las versiones de PS cuando se especifica mediante los parámetros) y maneja cookies si su API así lo requiere.