Выполнение вызова API в Python с помощью API, для которого требуется токен-носитель


91

Нужна помощь по интеграции вызова JSON API в программу Python.

Я хочу интегрировать следующий API в программу Python .py, чтобы он мог вызываться и печатать ответ.

В руководстве по API указано, что токен-носитель должен быть сгенерирован, чтобы разрешить вызовы API, что я успешно сделал. Однако я не уверен в синтаксисе включения этого токена в качестве аутентификации токена-носителя в запрос Python API.

Я могу успешно выполнить вышеуказанный запрос, используя cURL с включенным токеном. Я пробовал маршруты urllib и requests, но безрезультатно.

Полная информация об API: Документация по API IBM X-Force Exchange - IP Reputation

Ответы:


142

Это просто означает, что он ожидает, что в качестве ключа в ваших данных заголовка

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 ... не называйте это
Джоран Бисли

Спасибо, Джоран Бизли. Обновлена ​​библиотека запросов через pip, что позволило мне сохранить исходный синтаксис. Однако теперь, когда я запускаю указанное выше, он выводит этот ответ .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-адрес вашего приложения в их удаление панель для вашего кода ... скорее всего, это ваш первый токен ... вам нужно обменять токен на токен обновления, который вы затем можете использовать для получения более постоянного токена (по крайней мере, так обычно работает oauth2 ..)
Джоран Бисли

упс, похоже, у меня был неправильный заголовок, попробуй обновленный код
Джоран Бисли

50

Если вы используете 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аргумент, что и базовую аутентификацию, и может помочь вам в определенных ситуациях.


Это может быть полезно и с zeep. Он использует авторизацию типа requests.auth (для HTTP-заголовков auth, а не для заголовков мыла)
smido

20

Токен должен быть помещен в заголовок авторизации в следующем формате:

Авторизация: предъявитель [Token_Value]

Код ниже:

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

Для Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.