curl 带身份验证的Python请求(access_token)

mpbci0fu  于 2022-11-13  发布在  Python
关注(0)|答案(8)|浏览(337)

我正在尝试将API查询导入python。命令行

curl --header "Authorization:access_token myToken" https://website.example/id

给出了一些JSON输出。myToken是一个十六进制变量,在整个过程中保持不变。我想从python中调用这个变量,这样我就可以循环通过不同的id并分析输出。在需要验证之前,我已经用urllib2完成了验证。我还看了一下requests模块,但不知道如何完成。

gudnpqoy

gudnpqoy1#

requests包为HTTP请求提供了一个非常好的API,添加自定义头的工作方式如下(源代码:官方文件):

>>> import requests
>>> response = requests.get(
... 'https://website.example/id', headers={'Authorization': 'access_token myToken'})

如果你不想使用外部依赖,同样的事情使用urllib2的标准库看起来是这样的(资料来源:丢失的手册):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.example/id', headers={'Authorization': 'access_token myToken'})
ukxgm1gy

ukxgm1gy2#

我在Github中使用令牌时也遇到了同样的问题。
我在Python 3中使用的唯一语法是:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)
vfhzx4xs

vfhzx4xs3#

>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

如果以上方法不起作用,请尝试以下方法:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()
q3aa0525

q3aa05254#

import requests

BASE_URL = 'http://localhost:8080/v3/getPlan'
token = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImR"

headers = {'Authorization': "Bearer {}".format(token)}
auth_response = requests.get(BASE_URL, headers=headers)

print(auth_response.json())

输出量:

{
"plans": [
    {
        "field": false,
        "description": "plan 12",
        "enabled": true
    }
  ]
}
zlhcx6iw

zlhcx6iw5#

你试过uncurl软件包(https://github.com/spulec/uncurl)吗?你可以通过pip,pip install uncurl来安装它。你的curl请求返回:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)
n1bvdmb6

n1bvdmb66#

已经有很多好的答案了,但我还没有看到这个选项:
如果使用requests,还可以指定自定义身份验证类,类似于HTTPBasicAuth。例如:

from requests.auth import AuthBase

class TokenAuth(AuthBase):
    def __init__(self, token, auth_scheme='Bearer'):
        self.token = token
        self.auth_scheme = auth_scheme

    def __call__(self, request):
        request.headers['Authorization'] = f'{self.auth_scheme} {self.token}'
        return request

这可以按如下方式使用(使用示例中的自定义auth_scheme):

response = requests.get(
    url='https://example.com', 
    auth=TokenAuth(token='abcde', auth_scheme='access_token'),
)

这看起来像是设置Request.headers属性的一种更复杂的方法,但是如果你想支持多种类型的身份验证,这可能是有利的。注意,这允许我们使用auth参数而不是headers参数。

13z8s7eq

13z8s7eq7#

我再补充一点提示:作为头的键值传递的值似乎取决于授权类型,在我的例子中是PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
kiz8lqtg

kiz8lqtg8#

python中使用的选项之一检索如下:

import requests

token="abcd" < retrieved based>
headers = {'Authorization': "Bearer {}".format(token)}
response = requests.get(
    'https://<url api>',
    headers=headers,
    verify="root ca certificate"
)

print(response.content)

如果出现主机名不匹配错误,则需要在服务器中使用主机名配置其他SAN。
希望这对你有帮助。

相关问题