Za pomocą cURL możemy przekazać nazwę użytkownika z żądaniem HTTP w następujący sposób:
$ curl -u <your_username> https://api.github.com/user
-u
Flagi przyjmuje nazwę użytkownika do uwierzytelniania, a następnie cURL poprosi hasło. Przykład cURL dotyczy uwierzytelniania podstawowego za pomocą interfejsu API GitHub .
W jaki sposób podobnie przekazujemy nazwę użytkownika i hasło wraz z Invoke-WebRequest? Ostatecznym celem jest korzystanie z programu PowerShell z uwierzytelnianiem podstawowym w interfejsie API GitHub.
powershell
github-api
basic-authentication
Shaun Luttin
źródło
źródło
$pair = "$($user):$($pass)"
Sprawdź zatwierdzoną odpowiedź.-Credential
podejście, nie działa, ponieważ poprawny nagłówek uwierzytelniania nie jest generowany po wysłaniu żądania.Odpowiedzi:
Zakładam tutaj uwierzytelnianie podstawowe.
Możesz uzyskać swoje dane uwierzytelniające w inny sposób (
Import-Clixml
itp.), Ale musi to być[PSCredential]
obiekt.Edytuj na podstawie komentarzy:
GitHub łamie RFC, jak wyjaśniają w podanym przez Ciebie łączu :
Według
Invoke-WebRequest
mojej wiedzy, PowerShell czeka na odpowiedź 401 przed wysłaniem poświadczeń, a ponieważ GitHub nigdy ich nie dostarcza, twoje poświadczenia nigdy nie zostaną wysłane.Ręcznie utwórz nagłówki
Zamiast tego będziesz musiał samodzielnie utworzyć podstawowe nagłówki uwierzytelniania.
Uwierzytelnianie podstawowe pobiera ciąg składający się z nazwy użytkownika i hasła oddzielone dwukropkiem,
user:pass
a następnie wysyła wynik zakodowany w formacie Base64.Kod taki powinien działać:
Możesz łączyć niektóre konkatenacje ciągów, ale chciałem to przerwać, aby było jaśniejsze.
źródło
Użyj tego:
źródło
Musiałem to zrobić, aby zadziałało:
źródło
Invoke-WebRequest
jest zgodny z RFC2617, jak zauważył @briantist, jednak istnieją pewne systemy (np. JFrog Artifactory), które pozwalają na anonimowe użycie, jeśliAuthorization
nagłówek jest nieobecny, ale odpowiedzą,401 Forbidden
jeśli nagłówek zawiera nieprawidłowe poświadczenia.Można to wykorzystać do wyzwolenia
401 Forbidden
odpowiedzi i zabrania się-Credentials
do pracy.Spowoduje to wysłanie nieprawidłowego nagłówka za pierwszym razem, który zostanie zastąpiony prawidłowymi danymi uwierzytelniającymi w drugim żądaniu, ponieważ
-Credentials
zastępujeAuthorization
nagłówek.Przetestowano z Powershell 5.1
źródło
Gdyby ktoś potrzebował jednej wkładki:
źródło
innym sposobem jest użycie certutil.exe, zapisz swoją nazwę użytkownika i hasło w pliku np. in.txt jako nazwa użytkownika: hasło
Teraz powinieneś móc użyć wartości auth z out.txt
źródło
Wiem, że jest to trochę odbiegające od pierwotnego żądania OP, ale natknąłem się na to, szukając sposobu na użycie Invoke-WebRequest przeciwko witrynie wymagającej podstawowego uwierzytelnienia.
Różnica polega na tym, że nie chciałem zapisywać hasła w skrypcie. Zamiast tego chciałem poprosić program uruchamiający skrypty o dane uwierzytelniające dla witryny.
Oto jak sobie z tym poradziłem
W rezultacie program uruchamiający skrypt jest monitowany o okno dialogowe logowania dla U / P, a następnie Invoke-WebRequest może uzyskać dostęp do witryny przy użyciu tych poświadczeń. To działa, ponieważ $ Cred.Password jest już zaszyfrowanym ciągiem.
Mam nadzieję, że pomoże to komuś szukającemu podobnego rozwiązania powyższego pytania, ale bez zapisywania nazwy użytkownika lub PW w skrypcie
źródło
To właśnie zadziałało w naszej szczególnej sytuacji.
Notatki pochodzą z Wikipedii na temat uwierzytelniania podstawowego po stronie klienta . Dziękuję @ briantist za pomoc!
Połącz nazwę użytkownika i hasło w jeden ciąg
username:password
Zakoduj ciąg zgodnie z wariantem RFC2045-MIME Base64, z wyjątkiem nie ograniczania się do 76 znaków / linii.
Utwórz wartość Auth jako metodę, spację, a następnie zakodowaną parę
Method Base64String
Utwórz nagłówek
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Wywołaj żądanie sieciowe
Wersja tego programu PowerShell jest bardziej szczegółowa niż wersja cURL. Dlaczego? @briantist wskazał, że GitHub łamie RFC i PowerShell się do tego trzyma. Czy to oznacza, że cURL również łamie standardy?
źródło