GitHub API'sinde temel kimlik doğrulaması için bir kullanıcı adı ve parola ile Invoke-WebRequest'i kullanın


127

CURL ile, aşağıdaki gibi bir HTTP web isteği ile bir kullanıcı adı geçirebiliriz:

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

-uBayrak kimlik doğrulaması için bir kullanıcı adı kabul eder ve daha sonra cURL şifresini isteyecektir. CURL örneği, GitHub Api ile Temel kimlik doğrulaması içindir .

Invoke-WebRequest ile benzer şekilde bir kullanıcı adı ve parolayı nasıl iletiriz? Nihai hedef, GitHub API'de Temel kimlik doğrulamasıyla PowerShell'i kullanmaktır.


$ pair $pair = "$($user):$($pass)"Onaylanmış cevabı kontrol et olmalıdır . Yukarıdakileri kullanıyordum ve bu bana çok fazla acı verdi
Bhavjot

-CredentialYaklaşımı öneren çözümlerin hiçbiri , talep yapıldığında doğru kimlik doğrulama başlığı oluşturulmadığı için çalışmaz.
StingyJack

@Shaun Luttin - Bu bir soru ..... ve cevap sitesi, Soru Cevap sitesi değil. Bu tek kullanıcı, sizin özel durumunuz için işe yarayanlar dışında olası bir soru ve yanıt olarak kısa ve öz bir soru görmeyi tercih eder, ancak bunu iki kez okumak zorunda kalmaz (bir kez düzenlenmiş Soru'da, şimdi Soru Cevapla ve sonra tekrar yanıtlarda). Endişe, soruya en yakın olmamanıza yardımcı olan cevapsa, StackExchange en iyi / kabul edilen yanıtı şimdiden soruya olabildiğince yaklaştırma işlevine sahiptir.
user66001

1
@ user66001 Geri bildiriminiz için teşekkür ederiz. Soru içinde yanıtımı daha sonra başvurmak üzere kendi yanıtına taşıdım. Bunun bir gelişme olduğunu düşünüyorum.
Shaun Luttin

@ShaunLuttin - Harika fikir! :)
user66001

Yanıtlar:


147

Burada Temel kimlik doğrulamasını varsayıyorum.

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

Kimlik bilgilerinizi başka yollarla ( Import-Clixmlvb.) Edinebilirsiniz, ancak bunun bir [PSCredential]nesne olması gerekir .

Yorumlara göre düzenleyin:

GitHub, sağladığınız bağlantıda açıklandığı gibi RFC'yi bozuyor :

API, RFC2617'de tanımlandığı gibi, birkaç küçük farkla Temel Kimlik Doğrulamayı destekler. Temel fark, RFC'nin kimliği doğrulanmamış isteklerin 401 Yetkisiz yanıtlarla yanıtlanmasını gerektirmesidir. Birçok yerde bu, kullanıcı verilerinin varlığını ortaya çıkarır. Bunun yerine GitHub API, 404 Not Found ile yanıt verir. Bu, 401 Yetkisiz yanıtı olduğunu varsayan HTTP kitaplıkları için sorunlara neden olabilir. Çözüm, Yetkilendirme başlığını manuel olarak oluşturmaktır.

Powershell'in Invoke-WebRequestbildiğim kadarıyla, kimlik bilgilerini göndermeden önce 401 yanıtını bekler ve GitHub hiçbir zaman yanıt vermediği için kimlik bilgileriniz asla gönderilmez.

Başlıkları manuel olarak oluşturun

Bunun yerine, temel kimlik doğrulama başlıklarını kendiniz oluşturmanız gerekir.

Temel kimlik doğrulama, iki nokta üst üste user:passile ayrılmış kullanıcı adı ve paroladan oluşan bir dizeyi alır ve ardından bunun Base64 kodlu sonucunu gönderir.

Bunun gibi bir kod çalışmalıdır:

$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

Dize birleştirme işleminin bir kısmını birleştirebilirsiniz, ancak daha net hale getirmek için onu kırmak istedim.


1
Dediğim gibi, Temel kimlik doğrulama için çalışıyor, ancak GitHub API'nin ne tür kimlik doğrulaması kullandığını bilmiyorum. Beklenenler hakkında bazı ayrıntılar gönderebilirsiniz ve bu, sorunu çözmemize yardımcı olabilir.
briantist

1
Ah, öyle görünüyor ki GitHub (kendi kabullerine göre) RFC'yi takip etmiyor, ancak Powershell izliyor. Yanıtı daha fazla bilgi ve geçici bir çözümle düzenledim.
briantist

1
Evet, bu tür çok sayıda arama yapacaksanız, bunu bir işlevle sarmalamanızı tavsiye ederim. Dediğim gibi ben gerçekten netlik için tüm parçaları patlak, ama olabilir (sadece dağınık olurdu) bir satırda her şeyi.
briantist

1
@Aref, kullandığınız kodla yeni bir soru göndermelisiniz. Bunu yaparsanız ve bana haber verirseniz, bir göz atacağım.
briantist

1
Visual Studio Team Services REST API ile de kimlik doğrulaması yapmaya çalışıyorsanız başlıkları manuel olarak oluşturmanız gerekir
Brent Robinson

44

Bunu kullan:

$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

TFS vNext'te kullanırken bazı nedenlerden dolayı seçilen yanıt benim için işe yaramadı, ancak bu hile yaptı. Çok teşekkürler!
Tybs

Seçilen yanıt, tetiklenen bir işi başlatmak için Azure üzerinde bir powershell runbook çalıştırmak için işe yaramadı, ancak bu yanıt işe yaradı.
Sam

7

Çalışması için bunu yapmak zorundaydım:

$pair = "$($user):$($pass)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Pair))
$headers = @{ Authorization = "Basic $encodedCredentials" }
Invoke-WebRequest -Uri $url -Method Get -Headers $headers -OutFile Config.html

6

Invoke-WebRequest@briantist'in belirttiği gibi RFC2617'yi takip eder, ancak Authorizationbaşlık yoksa anonim kullanıma izin veren ancak 401 Forbiddenbaşlık geçersiz kimlik bilgileri içeriyorsa yanıt verecek bazı sistemler (örn. JFrog Artifactory) vardır .

Bu, 401 Forbiddenyanıtı tetiklemek ve işe -Credentialsbaşlamak için kullanılabilir .

$login = Get-Credential -Message "Enter Credentials for Artifactory"

                              #Basic foo:bar
$headers = @{ Authorization = "Basic Zm9vOmJhcg==" }  

Invoke-WebRequest -Credential $login -Headers $headers -Uri "..."

Bu geçersiz başlığını beri ikinci istekte geçerli kimlik bilgileri ile değiştirilecektir ilk kez, gönderir -Credentialsgeçersiz kılar Authorizationbaşlığı.

Powershell 5.1 ile test edildi


5

Birinin tek bir astara ihtiyacı varsa:

iwr -Uri 'https://api.github.com/user' -Headers @{ Authorization = "Basic "+ [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("user:pass")) }

2

başka bir yol, certutil.exe'yi kullanmaktır, kullanıcı adınızı ve parolanızı bir dosyaya kaydedin, örn. kullanıcı adı: parola olarak in.txt

certutil -encode in.txt out.txt

Artık out.txt'deki kimlik doğrulama değerini kullanabilmelisiniz

$headers = @{ Authorization = "Basic $((get-content out.txt)[1])" }
Invoke-WebRequest -Uri 'https://whatever' -Headers $Headers

2

Bunun OP'nin orijinal isteğinden biraz farklı olduğunu biliyorum, ancak bununla, temel kimlik doğrulama gerektiren bir siteye karşı Invoke-WebRequest'i kullanmanın bir yolunu ararken karşılaştım.

Aradaki fark, şifreyi komut dosyasına kaydetmek istemedim. Bunun yerine, site için kimlik bilgilerini komut dosyası çalıştırıcısına yönlendirmek istedim.

İşte bunu nasıl hallettim

$creds = Get-Credential

$basicCreds = [pscredential]::new($Creds.UserName,$Creds.Password)

Invoke-WebRequest -Uri $URL -Credential $basicCreds

Sonuç, komut dosyası çalıştırıcısına U / P için bir oturum açma iletişim kutusu istenir ve ardından Invoke-WebRequest bu kimlik bilgileriyle siteye erişebilir. Bu çalışır çünkü $ Creds.Password zaten şifrelenmiş bir dizedir.

Umarım bu, kullanıcı adını veya PW'yi komut dosyasında kaydetmeden yukarıdaki soruya benzer bir çözüm arayan birine yardımcı olur.


0

Bu bizim özel durumumuz için işe yarayan şeydi.

Notlar , İstemci Tarafından Temel Kimlik Doğrulama ile ilgili Wikipedia'dan alınmıştır . @ Briantist'in yardım cevabına teşekkür ederiz !

Kullanıcı adını ve şifreyi tek bir dizede birleştirin username:password

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

Dizeyi, 76 karakter / satır ile sınırlı olmamak üzere Base64'ün RFC2045-MIME varyantına kodlayın.

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

Yöntem, boşluk ve ardından kodlanmış çift olarak Auth değerini oluşturun Method Base64String

$basicAuthValue = "Basic $base64"

Başlığı oluşturun Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

$headers = @{ Authorization = $basicAuthValue }

Web talebini çağırın

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

Bunun PowerShell sürümü, cURL sürümünden daha ayrıntılıdır. Neden? @briantist, GitHub'ın RFC'yi kırdığını ve PowerShell'in buna bağlı kaldığını belirtti. Bu, cURL'nin de standardı bozduğu anlamına mı geliyor?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.