Utilice Invoke-WebRequest con un nombre de usuario y contraseña para la autenticación básica en la API de GitHub

Pregunta inicial

Con cURL, podemos pasar un nombre de usuario con una solicitud web HTTP de la siguiente manera:

$ curl -u  https://api.github.com/user 

El -u acepta un nombre de usuario para autenticación, y luego cURL solicitará la contraseña. El ejemplo cURL es para autenticación básica con GitHub Api .

¿Cómo pasamos de manera similar un nombre de usuario y contraseña junto con Invoke-WebRequest? El objective final es utilizar PowerShell con autenticación básica en la API de GitHub.

Editar (esto es lo que funcionó)

Las notas son de Wikipedia en Basic Auth desde el lado del cliente .

Combina el nombre de usuario y la contraseña en una sola cadena username:password

 $user = "shaunluttin" $pass = "super-strong-alpha-numeric-symbolic-long-password" $pair = "${user}:${pass}" 

Codifique la cadena a la variante RFC2045-MIME de Base64, excepto que no se limita a 76 caracteres / línea.

 $bytes = [System.Text.Encoding]::ASCII.GetBytes($pair) $base64 = [System.Convert]::ToBase64String($bytes) 

Cree el valor Auth como el método, un espacio y luego el par codificado Method Base64String

 $basicAuthValue = "Basic $base64" 

Crear la Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== del encabezado Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

 $headers = @{ Authorization = $basicAuthValue } 

Invocar la solicitud web

 Invoke-WebRequest -uri "https://api.github.com/user" -Headers $headers 

¡Gracias a @briantist por la ayuda!

Discusión

La versión de PowerShell de esto es más detallada que la versión de cURL. ¿Porqué es eso? @briantist señaló que GitHub está rompiendo el RFC y PowerShell se está apegando a él. ¿Eso significa que cURL también está rompiendo con el estándar?

Estoy asumiendo la autenticación básica aquí.

 $cred = Get-Credential Invoke-WebRequest -Uri 'https://whatever' -Credential $cred 

Puede obtener su credencial por otros medios ( Import-Clixml , etc.), pero tiene que ser un objeto [PSCredential] .

Edición basada en comentarios:

GitHub está rompiendo RFC como lo explican en el enlace que proporcionó :

La API admite la Autenticación básica tal como se define en RFC2617 con algunas pequeñas diferencias. La principal diferencia es que el RFC requiere que las solicitudes no autenticadas sean respondidas con 401 respuestas no autorizadas. En muchos lugares, esto revelaría la existencia de datos de usuario. En cambio, la API de GitHub responde con 404 No encontrado. Esto puede causar problemas para las bibliotecas HTTP que asumen una respuesta 401 no autorizada. La solución es crear manualmente el encabezado Authorization.

Invoke-WebRequest , según mi conocimiento, espera una respuesta 401 antes de enviar las credenciales, y dado que GitHub nunca proporciona una, sus credenciales nunca se enviarán.

Construye manualmente los encabezados

En su lugar, tendrás que crear los encabezados básicos de autenticación tú mismo.

La autenticación básica toma una cadena que consiste en el nombre de usuario y la contraseña separados por un user:pass dos puntos user:pass y luego envía el resultado codificado en Base64 de eso.

Código como este debería funcionar:

 $user = 'user' $pass = 'pass' $pair = "$($user):$($pass)" $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair)) $basicAuthValue = "Basic $encodedCreds" $Headers = @{ Authorization = $basicAuthValue } Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers 

Podría combinar algo de la concatenación de cadenas, pero quería separarlo para hacerlo más claro.

Utilizar esta:

 $root = 'REST_SERVICE_URL' $user = "user" $pass= "password" $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd) $result = Invoke-RestMethod $root -Credential $credential 

Invoke-WebRequest sigue el RFC2617 como @briantist señaló, sin embargo, hay algunos sistemas (por ejemplo, JFrog Artifactory) que permiten el uso anónimo si el encabezado Authorization está ausente, pero responderán con 401 Forbidden si el encabezado contiene credenciales no válidas.

Esto se puede usar para activar la respuesta 401 Forbidden y hacer que las -Credentials funcionen.

 $login = Get-Credential -Message "Enter Credentials for Artifactory" #Basic foo:bar $headers = @{ Authorization = "Basic Zm9vOmJhcg==" } Invoke-WebRequest -Credential $login -Headers $headers -Uri "..." 

Esto enviará el encabezado no válido la primera vez, que se reemplazará con las credenciales válidas en la segunda solicitud, ya que -Credentials anula el encabezado Authorization .

Probado con Powershell 5.1

    Intereting Posts