पायथन में एक एपीआई के साथ एक एपीआई कॉल करना जिसमें एक वाहक टोकन की आवश्यकता होती है


98

पायथन प्रोग्राम में JSON API कॉल को एकीकृत करने के लिए कुछ मदद की तलाश है।

मैं निम्नलिखित एपीआई को एक पायथन प्रोग्राम में एकीकृत करना चाह रहा हूं। किसी प्रोग्राम को इसे कॉल करने और प्रिंट होने की प्रतिक्रिया देने की अनुमति देता है।

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

मैं एक टोकन के साथ cURL का उपयोग करके उपरोक्त अनुरोध को सफलतापूर्वक पूरा कर सकता हूं। मैंने "urllib" और "अनुरोध" मार्गों की कोशिश की है, लेकिन कोई फायदा नहीं हुआ।

पूर्ण एपीआई विवरण: आईबीएम एक्स-फोर्स एक्सचेंज एपीआई प्रलेखन - आईपी प्रतिष्ठा

जवाबों:


147

इसका मतलब यह है कि यह उम्मीद करता है कि आपके हेडर डेटा में एक कुंजी के रूप में

import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}

print(requests.post(endpoint, data=data, headers=headers).json())

उपरोक्त सिंटैक्स त्रुटि को फेंकता है: Traceback (most recent call last): File "bearerreturn.py", line 6, in <module> print requests.post(endpoint,data=data,headers=headers).json() TypeError: 'dict' object is not callable कोड नीचे: import requests endpoint = "https://xforce-api.mybluemix.net:443/api/ip" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN WAS INSERTED HERE"} print requests.post(endpoint,data=data,headers=headers).json() कोई विचार?
user4657

आपके पास अनुरोधों का एक पुराना संस्करण है ... jsonआपके संस्करण में एक तानाशाही है और एक फ़ंक्शन नहीं है requests.post(...).json ... इसे कॉल न करें
जोरन बेज़ले

धन्यवाद जोरन ब्यासले। पाइप के माध्यम से अद्यतित पुस्तकालय और इससे मुझे मूल सिंटैक्स रखने की अनुमति मिली। हालाँकि अब जब मैं ऊपर चलाता हूँ तो यह इस आउटपुट को .json प्रतिक्रिया देता है: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} यह वैसा ही है जैसे कि मैं URL को सीधे किसी ब्राउज़र में मारता हूँ। क्या मुझे टोकन के साथ कुछ याद आ रहा है या जिस तरह से समापन बिंदु कॉन्फ़िगर किया गया है? कोड:import requests endpoint = "https://xforce-api.mybluemix.net:443/ipr/" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN_HERE"} print requests.post(endpoint,data=data,headers=headers).json()
user4657

दुर्भाग्य से मैं वास्तव में इसके साथ मदद नहीं कर सकता ... यह या तो एक खराब समापन बिंदु है या आपके क्रेडेंशियल्स अमान्य हैं (क्या आप उनके उदाहरण टोकन का उपयोग कर रहे हैं, जो केवल उनके url के लिए कॉन्फ़िगर किया गया है?) या शायद आपको अपने ऐप url को उनके deleoper में डालने की आवश्यकता है? अपने कोड के लिए पैनल ... संभावना thats अपने पहले टोकन ... आप एक ताज़ा टोकन है कि आप तो एक अधिक स्थायी टोकन प्राप्त करने के लिए उपयोग कर सकते हैं टोकन की जरूरत है (कम से कम thats पर कैसे OAuth2 आमतौर पर काम करता है ..)
Joran बीस्ले

हूप्स को लगता है कि मैंने हेडर को अपडेट किया कोड को गलत करने की कोशिश की थी
जोरान बिसले

56

यदि आप requestsमॉड्यूल का उपयोग कर रहे हैं , तो एक वैकल्पिक विकल्प एक कक्षा को लिखने के लिए है, जैसा कि " नए रूपों के प्रमाणीकरण " में चर्चा की गई है :

import requests

class BearerAuth(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        r.headers["authorization"] = "Bearer " + self.token
        return r

और फिर आप इस तरह अनुरोध भेज सकते हैं

response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))

जो आपको authमूल तर्क की तरह ही तर्क का उपयोग करने की अनुमति देता है , और कुछ स्थितियों में आपकी मदद कर सकता है।


यह जीप के साथ भी उपयोगी हो सकता है। यह
request.auth

20

टोकन को निम्न प्रारूप के अनुसार एक प्राधिकरण हेडर में रखा जाना है:

प्राधिकरण: बियरर [टोकन_वैल्यू]

नीचे कोड:

import urllib2
import json

def get_auth_token():
    """
    get an auth token
    """
    req=urllib2.Request("https://xforce-api.mybluemix.net/auth/anonymousToken")
    response=urllib2.urlopen(req)
    html=response.read()
    json_obj=json.loads(html)
    token_string=json_obj["token"].encode("ascii","ignore")
    return token_string

def get_response_json_object(url, auth_token):
    """
    returns json object with info
    """
    auth_token=get_auth_token()
    req=urllib2.Request(url, None, {"Authorization": "Bearer %s" %auth_token})
    response=urllib2.urlopen(req)
    html=response.read()
    json_obj=json.loads(html)
    return json_obj

पायथन req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
सिडजे

0

CURL और पायथन में कार्यान्वयन का पूर्ण उदाहरण है - प्राधिकरण के लिए और एपीआई कॉल करने के लिए

कर्ल

1. प्राधिकरण

आपको इस तरह से एक्सेस डेटा प्राप्त हुआ है:

Username: johndoe

Password: zznAQOoWyj8uuAgq

Consumer Key: ggczWttBWlTjXCEtk3Yie_WJGEIa

Consumer Secret: uuzPjjJykiuuLfHkfgSdXLV98Ciga

जिसे आप इस तरह से कॉल कर सकते हैं:

curl -k -d "grant_type=password&username=Username&password=Password" \

                    -H "Authorization: Basic Base64(consumer-key:consumer-secret)" \

                       https://somedomain.test.com/token

या इस मामले के लिए यह होगा:

curl -k -d "grant_type=password&username=johndoe&password=zznAQOoWyj8uuAgq" \

                    -H "Authorization: Basic zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh" \

                      https://somedomain.test.com/token

उत्तर कुछ इस तरह होगा:

{
    "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
    "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
    "scope": "default",
    "token_type": "Bearer",
    "expires_in": 3600
}

2. एपीआई कॉलिंग

यहां बताया गया है कि आप कुछ एपीआई कैसे कहते हैं जो ऊपर से प्रमाणीकरण का उपयोग करता है। Limitऔर offsetकेवल 2 मापदंडों के उदाहरण हैं जिन्हें एपीआई लागू कर सकता है। आपको access_tokenबाद में ऊपर से डाला गया है "Bearer "। यहाँ पर आप ऊपर से प्रमाणीकरण डेटा के साथ कुछ एपीआई कैसे कहते हैं:

curl -k -X GET "https://somedomain.test.com/api/Users/Year/2020/Workers?offset=1&limit=100" -H "accept: application/json" -H "Authorization: Bearer zz8d62zz-56zz-34zz-9zzf-azze1b8057f8"

अजगर

ऊपर से समान बात पायथन में लागू की गई। मैंने टिप्पणियों में पाठ डाला है ताकि कोड कॉपी-पेस्ट किया जा सके।

# Authorization data

import base64
import requests

username = 'johndoe'
password= 'zznAQOoWyj8uuAgq'
consumer_key = 'ggczWttBWlTjXCEtk3Yie_WJGEIa'
consumer_secret = 'uuzPjjJykiuuLfHkfgSdXLV98Ciga'
consumer_key_secret = consumer_key+":"+consumer_secret
consumer_key_secret_enc = base64.b64encode(consumer_key_secret.encode()).decode()

# Your decoded key will be something like:
#zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh


headersAuth = {
    'Authorization': 'Basic '+ str(consumer_key_secret_enc),
}

data = {
  'grant_type': 'password',
  'username': username,
  'password': password
}

## Authentication request

response = requests.post('https://somedomain.test.com/token', headers=headersAuth, data=data, verify=True)
j = response.json()

# When you print that response you will get dictionary like this:

    {
        "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
        "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
        "scope": "default",
        "token_type": "Bearer",
        "expires_in": 3600
    }

# You have to use `access_token` in API calls explained bellow.
# You can get `access_token` with j['access_token'].


# Using authentication to make API calls   

## Define header for making API calls that will hold authentication data

headersAPI = {
    'accept': 'application/json',
    'Authorization': 'Bearer '+j['access_token'],
}

### Usage of parameters defined in your API
params = (
    ('offset', '0'),
    ('limit', '20'),
)

# Making sample API call with authentication and API parameters data

response = requests.get('https://somedomain.test.com/api/Users/Year/2020/Workers', headers=headersAPI, params=params, verify=True)
api_response = response.json()

@KurtPeters आपकी टिप्पणी का ओपी प्रश्न से कोई लेना-देना नहीं है। मेरा जवाब उसके मामले के लिए पूरी तरह से काम करता है।
हार्वे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.