Bearer 토큰이 필요한 API를 사용하여 Python에서 API 호출하기


91

JSON API 호출을 Python 프로그램에 통합하는 데 도움이 필요합니다.

다음 API를 Python .py 프로그램에 통합하여 호출하고 응답을 인쇄 할 수 있도록하려고합니다.

API 지침에는 API 호출을 허용하려면 베어러 토큰을 생성해야한다고 명시되어 있습니다. 그러나이 토큰을 Python API 요청에 전달자 토큰 인증으로 포함하는 구문이 확실하지 않습니다.

토큰이 포함 된 cURL을 사용하여 위의 요청을 성공적으로 완료 할 수 있습니다. "urllib"및 "요청"경로를 시도했지만 아무 소용이 없습니다.

전체 API 세부 사항 : IBM X-Force Exchange API 문서-IP 평판

답변:


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버전의 DICT 아닌 기능입니다 requests.post(...).json ... 그나마 호출이
Joran 비즐리를

감사합니다 Joran Beasley. 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가 일반적으로 작동하는 방식입니다 ..).
Joran Beasley

으악 외모는 내가 가진 같은 헤더 잘못된 업데이트 된 코드를 시도
Joran 비즐리

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 유형의 인증을 사용합니다 (
Sap

20

토큰은 다음 형식에 따라 Authorization 헤더에 배치되어야합니다.

승인 : Bearer [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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.