Python请求库如何使用单个标记传递Authorization标头

72 python authorization get token python-requests

我有一个请求URI和一个令牌.如果我使用:

curl -s "<MY_URI>" -H "Authorization: TOK:<MY_TOKEN>"
Run Code Online (Sandbox Code Playgroud)

等,我得到一个200并查看相应的JSON数据.所以,我安装了请求,当我尝试访问此资源时,我得到403可能是因为我不知道传递该令牌的正确语法.任何人都可以帮我搞清楚吗?这就是我所拥有的:

import sys,socket
import requests

r = requests.get('<MY_URI>','<MY_TOKEN>')
r. status_code
Run Code Online (Sandbox Code Playgroud)

我已经尝试过:

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>'))
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用.

Ian*_*sco 82

在python中:

('<MY_TOKEN>')
Run Code Online (Sandbox Code Playgroud)

相当于

'<MY_TOKEN>'
Run Code Online (Sandbox Code Playgroud)

并请求解释

('TOK', '<MY_TOKEN>')
Run Code Online (Sandbox Code Playgroud)

由于您希望请求使用基本身份验证并创建一个授权标头,如下所示:

'VE9LOjxNWV9UT0tFTj4K'
Run Code Online (Sandbox Code Playgroud)

哪个是base64表示的 'TOK:<MY_TOKEN>'

要传递自己的标题,您可以传入一个字典,如下所示:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})
Run Code Online (Sandbox Code Playgroud)


Baj*_*ajG 30

我正在寻找类似的东西,并遇到了这个.它看起来像你提到的第一个选项

r = requests.get('<MY_URI>', auth=('<MY_TOKEN>'))
Run Code Online (Sandbox Code Playgroud)

"auth"有两个参数:用户名和密码,所以实际的语句应该是

r=requests.get('<MY_URI>', auth=('<YOUR_USERNAME>', '<YOUR_PASSWORD>'))
Run Code Online (Sandbox Code Playgroud)

在我的情况下,没有密码,所以我将auth字段中的第二个参数留空,如下所示:

r=requests.get('<MY_URI', auth=('MY_USERNAME', ''))
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人:)

  • 如果你尝试 `r = requests.get('&lt;MY_URI&gt;',auth=('&lt;MY_TOKEN&gt;'))`,你会得到 `TypeError: 'str' object is not callable`。这让我难住了一段时间,直到我遇到了这个:/ (3认同)

E.N*_*N.D 19

这对我有用:

access_token = #yourAccessTokenHere#

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


Ant*_*nko 13

您还可以为整个会话设置标头:

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

with requests.Session() as s:

    s.headers.update(HEADERS)
    resp = s.get('http://example.com/')
Run Code Online (Sandbox Code Playgroud)


swa*_*ghi 6

你可以尝试这样的事情

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


小智 6

我在这里成立,它可以与我一起使用linkedin:https : //auth0.com/docs/flows/guides/auth-code/call-api-auth-code 所以我的代码与linkedin登录:

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()
Run Code Online (Sandbox Code Playgroud)


Ami*_*lum 5

请求本身仅支持使用用户通行参数的基本身份验证,而不使用令牌。

如果需要,您可以添加以下类以使请求支持基于令牌的基本身份验证:

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
Run Code Online (Sandbox Code Playgroud)

然后,要使用它,请运行以下请求:

r = requests.get(url, auth=BasicAuthToken(api_token))
Run Code Online (Sandbox Code Playgroud)

另一种方法是制定自定义标头,就像其他用户在此建议的那样。