GitHub API पर मूल प्रमाणीकरण के लिए एक उपयोगकर्ता नाम और पासवर्ड के साथ Invoke-WebRequest का उपयोग करें


127

CURL के साथ, हम एक उपयोगकर्ता नाम को HTTP वेब अनुरोध के साथ निम्न प्रकार से पास कर सकते हैं:

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

-uझंडा प्रमाणीकरण के लिए एक उपयोगकर्ता नाम को स्वीकार करता है, और फिर cURL पासवर्ड का अनुरोध करेगा। CURL उदाहरण GitHub Api के साथ मूल प्रमाणीकरण के लिए है

हम इसी तरह से एक यूजरनेम और पासवर्ड के साथ-साथ इनवोक-वेबरपेस्ट कैसे पास करते हैं? अंतिम लक्ष्य GitHub API में बेसिक प्रमाणीकरण के साथ PowerShell को उपयोगकर्ता के लिए है।


$ जोड़ी को $pair = "$($user):$($pass)"स्वीकृत उत्तर की जांच करनी चाहिए । मैं ऊपर का उपयोग कर रहा था और इसने मुझे बहुत दर्द दिया
भवजोत १३'१

-Credentialअनुरोध के सही होने पर सही समाधान हेडर के रूप में काम करने का सुझाव देने वाला कोई भी समाधान उत्पन्न नहीं होता है।
स्टिंगजैक

@ शॉन लुटिन - यह एक प्रश्न है ..... और उत्तर स्थल, प्रश्न उत्तर साइट नहीं। यह एक उपयोगकर्ता आपकी विशेष स्थिति के लिए काम करने के अलावा संभव सवाल और जवाब के रूप में एक सफल देखना पसंद करेगा, लेकिन यह पढ़ने के लिए नहीं है कि दो बार (एक बार संपादित प्रश्न में, अब आ जाओ प्रश्नावली, और फिर जवाब में)। यदि चिंता का उत्तर था, जिसने आपको सवाल के सबसे करीब नहीं होने में मदद की, तो StackExchange के पास सबसे अच्छा / स्वीकृत उत्तर लाने के लिए कार्यक्षमता है जो पहले से ही प्रश्न के करीब हो।
user66001

1
@ user66001 प्रतिक्रिया के लिए धन्यवाद। मैंने अपने उत्तर-प्रश्न को बाद के संदर्भ के लिए अपने स्वयं के उत्तर में स्थानांतरित कर दिया है। मुझे लगता है कि यह एक सुधार है।
शॉन लुटिन

@ शाउलुट्टिन - महान विचार! :)
user66001

जवाबों:


147

मैं यहां बेसिक ऑथेंटिकेशन मान रहा हूं।

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

आप अन्य माध्यमों ( Import-Clixml, आदि) के माध्यम से अपनी साख प्राप्त कर सकते हैं , लेकिन इसके लिए एक [PSCredential]वस्तु होना आवश्यक है ।

टिप्पणियों के आधार पर संपादित करें:

GitHub RFC को तोड़ रहा है क्योंकि वे आपके द्वारा दिए गए लिंक में बताते हैं :

एपीआई RFC2617 में थोड़े बहुत अंतर के साथ बुनियादी प्रमाणीकरण का समर्थन करता है। मुख्य अंतर यह है कि आरएफसी को अनधिकृत अनुरोधों को 401 अनधिकृत प्रतिक्रियाओं के साथ जवाब देने की आवश्यकता है। कई स्थानों पर, यह उपयोगकर्ता डेटा के अस्तित्व का खुलासा करेगा। इसके बजाय, GitHub API 404 Not Found के साथ प्रतिक्रिया करता है। 401 अनधिकृत प्रतिक्रिया मानने वाले HTTP पुस्तकालयों के लिए यह समस्या हो सकती है। समाधान मैन्युअल रूप से प्राधिकरण हेडर को क्राफ्ट करना है।

Powershell Invoke-WebRequestमेरे ज्ञान को साख भेजने से पहले 401 की प्रतिक्रिया की प्रतीक्षा करता है, और चूंकि GitHub कभी भी एक प्रदान नहीं करता है, इसलिए आपकी साख कभी नहीं भेजी जाएगी।

मैन्युअल रूप से हेडर का निर्माण करें

इसके बजाय आपको खुद ही आधारभूत हेडर बनाना होगा।

मूल प्रमाणीकरण में एक स्ट्रिंग होती है जिसमें एक उपनिवेश द्वारा अलग किए गए उपयोगकर्ता नाम और पासवर्ड शामिल होते हैं user:passऔर उसके बाद बेस 64 एनकोडेड परिणाम भेजता है।

इस तरह कोड काम करना चाहिए:

$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

आप कुछ स्ट्रिंग संयोजन को जोड़ सकते हैं लेकिन मैं इसे स्पष्ट करने के लिए इसे तोड़ना चाहता था।


1
जैसा कि मैंने कहा कि यह बुनियादी प्रमाणीकरण के लिए काम करता है, लेकिन मुझे नहीं पता कि GitHub API किस तरह के प्रमाणीकरण का उपयोग करता है। आप इस बारे में कुछ विवरण पोस्ट कर सकते हैं कि क्या उम्मीद है और इससे हमें समस्या को हल करने में मदद मिल सकती है।
रिश्वतवादी

1
आह, ऐसा लगता है कि GitHub RFC का अनुसरण नहीं कर रहा है (अपने स्वयं के प्रवेश द्वारा), लेकिन Powershell है। मैंने उत्तर को अधिक जानकारी और वर्कअराउंड के साथ संपादित किया है।
briantist

1
हाँ, यदि आप इस प्रकार की बहुत सारी कॉल करने जा रहे हैं, तो मैं इसे किसी फ़ंक्शन में लपेटने की सलाह दूंगा। जैसा कि मैंने कहा कि मैंने वास्तव में स्पष्टता के लिए सभी टुकड़ों को तोड़ दिया है, लेकिन आप यह सब एक पंक्ति में कर सकते हैं (यह सिर्फ गड़बड़ होगा)।
रिश्वतवादी

1
@ फिर भी, आपको अपने द्वारा उपयोग किए जा रहे कोड के साथ एक नया प्रश्न पोस्ट करना चाहिए। यदि आप ऐसा करते हैं और मुझे इसके बारे में बताते हैं तो मैं देखूंगा।
briantist

1
यदि आप Visual Studio Team Services REST API के विरुद्ध प्रमाणीकरण की कोशिश कर रहे हैं, तो आपको मैन्युअल रूप से हेडर बनाने की आवश्यकता होगी
Brent Robinson

44

इसे इस्तेमाल करो:

$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

किसी कारण से चयनित उत्तर मेरे लिए काम नहीं करता था जब इसे टीएफएस vNext पर उपयोग किया जाता था, लेकिन यह एक चाल है। आपका बहुत बहुत धन्यवाद!
तैयब

चयनित उत्तर ने ट्रिगर की गई नौकरी शुरू करने के लिए azure पर एक पॉवरशेल रनबुक चलाने के लिए काम नहीं किया, लेकिन इस उत्तर ने काम किया।
सैम

7

यह काम करने के लिए मुझे ऐसा करना पड़ा:

$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 के रूप में RFC2617 का उल्लेख किया गया है, हालांकि कुछ सिस्टम हैं (जैसे JFrog आर्टिफ़ैक्टिव) जो अनाम उपयोग की अनुमति देता है यदि Authorizationहेडर अनुपस्थित है, लेकिन इसका जवाब देंगे 401 Forbiddenकि क्या हेडर में अमान्य क्रेडेंशियल हैं।

इसका उपयोग 401 Forbiddenप्रतिक्रिया को ट्रिगर करने और -Credentialsकाम करने के लिए किया जा सकता है ।

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

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

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

यह पहली बार अमान्य हेडर भेजेगा, जो हेडर को -Credentialsओवरराइड करने के बाद से दूसरे अनुरोध में मान्य क्रेडेंशियल्स के साथ बदल दिया जाएगा Authorization

Powershell 5.1 के साथ परीक्षण किया गया


5

अगर किसी को एक लाइनर की आवश्यकता होगी:

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

2

दूसरा तरीका यह है कि किसी उपयोगकर्ता को अपने फ़ाइलनाम और पासवर्ड को बचाने के लिए certutil.exe का उपयोग करें। जैसे in.txt को उपयोगकर्ता नाम: पासवर्ड

certutil -encode in.txt out.txt

अब आपको out.txt से कई ऑल्टरनेटिव मान का उपयोग करने में सक्षम होना चाहिए

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

2

मुझे पता है कि यह ओपी मूल अनुरोध से थोड़ा हटकर है, लेकिन मूल प्रमाणीकरण की आवश्यकता वाली साइट के खिलाफ इनवोक-वेबरपेस्ट का उपयोग करने के तरीके की तलाश करते हुए मैं इस पर आया हूं।

अंतर यह है, मैं स्क्रिप्ट में पासवर्ड रिकॉर्ड नहीं करना चाहता था। इसके बजाय, मैं साइट के लिए क्रेडेंशियल्स के लिए स्क्रिप्ट धावक को संकेत देना चाहता था।

यहां बताया गया है कि मैंने इसे कैसे संभाला

$creds = Get-Credential

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

Invoke-WebRequest -Uri $URL -Credential $basicCreds

इसका परिणाम यह है कि स्क्रिप्ट रनर को यू / पी के लिए एक लॉगिन डायलॉग के साथ जोड़ा जाता है, फिर, इनवोक-वेबरपेस्ट उन क्रेडेंशियल्स के साथ साइट तक पहुंचने में सक्षम है। यह काम करता है क्योंकि $ Creds.Password पहले से ही एक एन्क्रिप्टेड स्ट्रिंग है।

मुझे उम्मीद है कि यह किसी को उपरोक्त प्रश्न के समान समाधान की तलाश में मदद करता है, लेकिन स्क्रिप्ट में उपयोगकर्ता नाम या पीडब्लू को बचाए बिना


0

यह वही है जो हमारी विशेष स्थिति के लिए काम करता है।

नोट्स क्लाइंट साइड से बेसिक ऑथ पर विकिपीडिया से हैं । मदद के लिए @ briantist के जवाब के लिए धन्यवाद !

उपयोगकर्ता नाम और पासवर्ड को एक स्ट्रिंग में मिलाएं username:password

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

76 char / line तक सीमित न रखते हुए, R642045-MIME बेस बेस के स्ट्रिंग को एनकोड करें।

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

विधि, एक स्थान और फिर एन्कोडेड जोड़ी के रूप में प्रामाणिक मान बनाएँ Method Base64String

$basicAuthValue = "Basic $base64"

हेडर बनाएं Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

$headers = @{ Authorization = $basicAuthValue }

वेब-अनुरोध को आमंत्रित करें

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

इसका PowerShell संस्करण, CURL संस्करण की तुलना में अधिक वर्बोज़ है। ऐसा क्यों है? @briantist ने बताया कि GitHub RFC को तोड़ रहा है और PowerShell इसे चिपका रहा है। इसका मतलब यह है कि मानक के साथ cURL भी टूट रहा है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.