पायथन पुस्तकालय का अनुरोध करता है कि एकल टोकन के साथ प्राधिकरण हेडर कैसे पारित किया जाए


98

मेरे पास एक अनुरोध URI और एक टोकन है। अगर मैं उपयोग करता हूं:

curl -s "<MY_URI>" -H "Authorization: TOK:<MY_TOKEN>"

आदि, मैं एक 200 मिलता है और इसी JSON डेटा देखें। इसलिए, मैंने अनुरोधों को स्थापित किया और जब मैं इस संसाधन तक पहुंचने का प्रयास करता हूं तो मुझे 403 मिलता है, क्योंकि मुझे उस टोकन को पास करने के लिए सही सिंटैक्स नहीं पता है। किसी ने मुझे यह पता लगाने में मदद कर सकते हैं? यह वही है जो मेरे पास है:

import sys,socket
import requests

r = requests.get('<MY_URI>','<MY_TOKEN>')
r. status_code

मैंने पहले ही कोशिश की:

r = requests.get('<MY_URI>',auth=('<MY_TOKEN>'))
r = requests.get('<MY_URI>',auth=('TOK','<MY_TOKEN>'))
r = requests.get('<MY_URI>',headers=('Authorization: TOK:<MY_TOKEN>'))

लेकिन इनमें से कोई भी काम नहीं करता है।

जवाबों:


113

अजगर में:

('<MY_TOKEN>')

के बराबर है

'<MY_TOKEN>'

और निवेदन करता है

('TOK', '<MY_TOKEN>')

जैसा कि आप चाहते हैं कि मूल प्रमाणीकरण का उपयोग करें और एक प्राधिकरण हेडर को शिल्पित करें जैसे:

'VE9LOjxNWV9UT0tFTj4K'

जिसका आधार64 प्रतिनिधित्व है 'TOK:<MY_TOKEN>'

अपना स्वयं का शीर्षलेख पास करने के लिए आप जैसे शब्दकोश में पास करते हैं:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})

ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "<stdin>", पंक्ति 1, में <मॉड्यूल> फ़ाइल "/Library/Frameworks/Python.framework/Versions/2.7/lib/pyfon2.7/site-packages/requests/api/ .py ", पंक्ति 55, रिटर्न रिक्वेस्ट में ('गेट', url, ** kwargs) फाइल" /Library/Frameworks/Python.framework/Versions/2.7/lib/pyth22.7/site-packages/requests/api/ .py ", लाइन 44, रिक्वेस्ट रिटर्न सेशन में ।request (विधि = विधि, url = url, ** kwargs) फ़ाइल" /Library/Frameworks/Python.framework/Versions/2.7-lib/python2.7/site-packages /requests/session.py ", पंक्ति 323, अनुरोध में prep = self.prepare_request (req)

@rebHelium आप कर सकते हैं सार है कि? यह संपूर्ण स्टैक ट्रेस नहीं है और इस बात का कोई संकेत नहीं है कि आपने वास्तव में क्या प्रयास किया है।
इयान स्टैपलटन कॉर्डैस्को

क्षमा करें, स्टैक ओवरफ्लो ने मुझे पूरे आउटपुट को पोस्ट करने की अनुमति नहीं दी। मैंने ठीक वैसा ही किया जैसा आपने सुझाया: r = request.get ('जो भी url मेरे पास है', हेडर = {'Authorization': 'TOK: जो भी टोकन मेरे पास है})

माफी मांगने की कोई जरूरत नहीं है। काम किया? आपने मेरा उत्तर स्वीकार कर लिया है, लेकिन ऐसा लगता है कि यह आपके लिए अपवाद है। यदि आप एक जिस्ट बनाते हैं तो मैं यहां वार्तालाप करने की तुलना में अधिक आसानी से आपकी सहायता कर सकता हूं।
इयान स्टैपलटन कॉर्डैस्को

सिग्मा, मैंने वास्तव में आपके कोड पर एक छोटी सी चूक को याद किया जो त्रुटि का कारण बना। वास्तविक कोड गोपनीय है, इसलिए मैं नहीं दे सकता। लेकिन मैं अतिरिक्त प्रश्न पोस्ट करूंगा क्योंकि मैं अपने पायथन कौशल में सुधार करना चाहता हूं, अगर आप देखना चाहते हैं। वे बहुत सरल प्रश्न हैं मुझे यकीन है कि आप जानते होंगे।

38

मैं कुछ इसी तरह की तलाश में था और इस पार आया । यह आपके द्वारा उल्लिखित पहले विकल्प में दिखता है

r = requests.get('<MY_URI>', auth=('<MY_TOKEN>'))

"सामान्य" दो पैरामीटर लेता है: उपयोगकर्ता नाम और पासवर्ड, इसलिए वास्तविक विवरण होना चाहिए

r=requests.get('<MY_URI>', auth=('<YOUR_USERNAME>', '<YOUR_PASSWORD>'))

मेरे मामले में, कोई पासवर्ड नहीं था, इसलिए मैंने नीचे दिखाए गए अनुसार दूसरे क्षेत्र को दूसरे क्षेत्र में खाली छोड़ दिया:

r=requests.get('<MY_URI', auth=('MY_USERNAME', ''))

आशा है कि यह किसी की मदद करता है :)


3
यदि आप कोशिश करते हैं r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), तो आपको मिलेगा TypeError: 'str' object is not callable। जब तक मैं इस पार आया था मुझे कुछ समय के लिए स्टम्प्ड: /
aydow

आपके aserd ने मेरी मदद की लेकिन आपके द्वारा प्रदान की गई लिंक को पढ़ने के बाद ही आप accros आए। HTTPBasicAuth के साथ काम करके request.auth से आयात करना बहुत आसान है!
Wallem89

27

यह मेरे लिए काम किया:

access_token = #yourAccessTokenHere#

result = requests.post(url,
      headers={'Content-Type':'application/json',
               'Authorization': 'Bearer {}'.format(access_token)})

16

आप पूरे सत्र के लिए हेडर भी सेट कर सकते हैं:

TOKEN = 'abcd0123'
HEADERS = {'Authorization': 'token {}'.format(TOKEN)}

with requests.Session() as s:

    s.headers.update(HEADERS)
    resp = s.get('http://example.com/')

4

अनुरोध मूल रूप से केवल उपयोगकर्ता-पास पारमों के साथ मूल स्रोत का समर्थन करता है, टोकन के साथ नहीं।

यदि आप चाहते थे, तो निम्न आधारभूत प्रमाणीकरण के लिए अनुरोधों के समर्थन के लिए निम्न वर्ग जोड़ें:

import requests
from base64 import b64encode

class BasicAuthToken(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        authstr = 'Basic ' + b64encode(('token:' + self.token).encode('utf-8')).decode('utf-8')
        r.headers['Authorization'] = authstr
        return r

फिर, इसका उपयोग करने के लिए निम्नलिखित अनुरोध चलाएं:

r = requests.get(url, auth=BasicAuthToken(api_token))

एक विकल्प इसके बजाय एक कस्टम हेडर तैयार करना होगा, जैसा कि यहां अन्य उपयोगकर्ताओं द्वारा सुझाया गया था।


4

मैंने यहां इसकी स्थापना की, लिंक्डइन के लिए मेरे साथ ठीक है: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code इसलिए मेरा कोड यहां लिंक्डइन लॉगिन के साथ:

ref = 'https://api.linkedin.com/v2/me'
headers = {"content-type": "application/json; charset=UTF-8",'Authorization':'Bearer {}'.format(access_token)}
Linkedin_user_info = requests.get(ref1, headers=headers).json()

2

आप कुछ इस तरह की कोशिश कर सकते हैं

r = requests.get(ENDPOINT, params=params, headers={'Authorization': 'Basic %s' %  API_KEY})

2

यह मेरे लिए काम किया:

r = requests.get('http://127.0.0.1:8000/api/ray/musics/', headers={'Authorization': 'Token 22ec0cc4207ebead1f51dea06ff149342082b190'})

मेरा कोड उपयोगकर्ता द्वारा निर्मित टोकन का उपयोग करता है।

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