2014-07-10 22 views
32

PowerShell en Invoke-RestMethod yılındaPowerShell en ınvoke RestMethod eşdeğer (Temel Kimlik Doğrulama)

curl -u username:password ... 

eşdeğer nedir? Denedim:

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

Invoke-RestMethod -Credential $credential ... 

Ancak 401, Yetkisiz olarak döndürülür.

cevap

59

Bu şimdiye kadar benim için çalıştı tek yöntemdir:

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

Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} ... 

Ama daha iyi bir yolu yoktur inanmıyorum.

9

Sizin durumunuzda -Credential parametresinin neden çalışmadığından emin değilim, ancak httpbin service ile çalışır.

Bu deneyebilirsiniz:

$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 

Edit: açıklamalarda belirtildiği gibi, bu yöntem ilk talep üzerine Yetkilendirme başlığını göndermez. Bir meydan okuma cevabını bekler, ardından talebi Yetkilendirme başlığıyla yeniden gönderir. Bu, ilk istekte kimlik bilgisi gerektiren hizmetler için çalışmaz.

+0

Bu konudaki snippet'ten nasıl farklıdır? – Borek

+0

Temel kimlik doğrulama için çalıştığı ve bunu test etmek için bir URL sağladığını onaylıyordum. Kullanıcıların temel soruları nasıl kullanacaklarını öğrenmek için bu soruya gelmelerini istemiyorum ve 'Kimlik Bilgileri'nin çalışmadığı söylenemez. Açıkladığım örnekte açıkça var. Durumunda kırılmasına neden olan bir şey olmalı. – Rynant

+0

Ah Üzgünüz, belirli bir URL'ye karşı test yapmanızı öneriyoruz. Benim durumumda, curl çalışır ve yetkilendirme HTTP üstbilgisini sağlama "el ile" yöntemim de çalışır, sadece bu değil Kimlik bilgisi. Dahili olarak ne yaptığını bilmiyor musun? Sadece aynı HTTP üstbilgisini ekler mi? – Borek

5

Görünüşte, bağımsız olarak başarısız olduklarında yöntemleri birleştirmeniz gerekir.

Kimlik bilgisini oluşturun ve isteğine ekleyin.

Başlığı oluşturun ve isteğine ekleyin.

$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" 
+0

?Burada eksik bir alıntı olduğunu hissediyorum. –

+1

Bunu nasıl ele alacağımı bilmiyorum, çünkü bazı uygulamalarda bazı uygulamaların Borek ve @Rynant'ın bulduğu ilk istekte hem kimlik bilgilerine ihtiyacı var gibi görünüyor. Yani bazen, aranan sunucuya bağlı olarak, yöntemleri birleştirmeniz gerekebilir. –

+1

Çözülen indirme yapay eserlerini VSO'dan birleştirmenin doğrulanması. Thnx. –

1

Bu sürüm Get-Credential 'ın PSCredential nesne ile çalışır. Ayrıca PowerShell 6.0'da çapraz platformda çalışır. Bu, bazen PSCredential'dan parolayı çıkarmaya çalışırken önerilen BSTR çağrılarının kullanılmasını engelleyerek yapar.

$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)} ... 
İlgili konular