Python请求库如何使用单个令牌传递授权头

155

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

curl -s "<MY_URI>" -H "Authorization: TOK:<MY_TOKEN>"

等等,当我请求时得到了一个200并查看相应的JSON数据。

所以,我安装了requests,但是当我尝试访问这个资源时,我得到了403错误,可能是因为我不知道如何传递那个令牌的正确语法。有人能帮我解决吗?

这是我拥有的:

import sys,socket
import requests

r = requests.get('<MY_URI>','<MY_TOKEN>')
r. status_code

我已经尝试过:

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>'))

但是这些都无效。

9个回答

158

在Python中:

('<MY_TOKEN>')

等同于

'<MY_TOKEN>'

并且 Requests 解释了 HTML。
('TOK', '<MY_TOKEN>')

您希望使用基本身份验证,并像下面这样创建授权标头:

'VE9LOjxNWV9UT0tFTj4K'

'TOK:<MY_TOKEN>' 转换为 base64 编码的表示形式。

如果要传递自己的标头,可以像下面一样传递一个字典:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})

跟踪(最近调用的最后一个): 文件“<stdin>”,第1行,在<module>中 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py”,第55行,在get中 返回request('get',url,kwargs) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py”,第44行,在请求中 返回session.request(method=method,url=url,kwargs) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py”,第323行,在请求中 prep = self.prepare_request(req) - user1552586
@rebHelium,你能在gist上分享一下吗?这不是完整的堆栈跟踪,并且没有显示你实际尝试了什么。 - Ian Stapleton Cordasco
抱歉,Stack Overflow 不允许我发布完整的输出。我按照您建议的方式进行了操作:r = requests.get('我拥有的任何 URL', headers={'Authorization': 'TOK:我拥有的任何令牌'})。 - user1552586
不用道歉。它起作用了吗?你接受了我的答案,但似乎对你造成了异常。如果你创建一个gist,我可以比在这里交谈更轻松地帮助你。 - Ian Stapleton Cordasco
1
这个可行!确保 Authorization 拼写正确。我将其拼写为 Authorisation,结果请求失败了。 - SeaWarrior404
显示剩余3条评论

62
我在寻找类似的东西时,偶然发现了这个。看起来它很像你提到的第一个选项
r = requests.get('<MY_URI>', auth=('<MY_TOKEN>'))

"auth"需要两个参数: 用户名和密码,因此实际语句应为

r=requests.get('<MY_URI>', auth=('<YOUR_USERNAME>', '<YOUR_PASSWORD>'))

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

r=requests.get('<MY_URI', auth=('MY_USERNAME', ''))

希望这能帮助到某些人 :)


7
еҰӮжһңдҪ е°қиҜ•дҪҝз”Ёr = requests.get('<MY_URI>',auth=('<MY_TOKEN>'))пјҢдҪ дјҡеҫ—еҲ°дёҖдёӘTypeError: 'str' object is not callableзҡ„й”ҷиҜҜгҖӮжҲ‘жӣҫз»Ҹиў«иҝҷдёӘй—®йўҳеӣ°жү°дәҶдёҖж®өж—¶й—ҙпјҢзӣҙеҲ°жҲ‘еҒ¶з„¶еҸ‘зҺ°дәҶи§ЈеҶіж–№жі• :/ - aydow
你的答案帮助了我,但只有在阅读你提供的链接后才起作用。使用requests.auth中的HTTPBasicAuth导入非常容易! - Wallem89

53

这个方法适用于我:

access_token = #yourAccessTokenHere#

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

28
你还可以为整个会话设置头部信息:

你还可以为整个会话设置头部信息:

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

with requests.Session() as s:

    s.headers.update(HEADERS)
    resp = s.get('http://example.com/')

9
我在这里找到了与Linkedin一起使用的解决方案,对我有效: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code 我使用的代码是:
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()

6
你可以尝试像这样的东西。
r = requests.get(ENDPOINT, params=params, headers={'Authorization': 'Basic %s' %  API_KEY})

5

Requests仅通过用户密码参数本地支持基本认证,而不支持令牌。

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

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

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

r = requests.get(url, auth=BasicAuthToken(api_token))

另一种选择是自定义标题,正如其他用户在这里建议的那样。

3
这个对我有用:
r = requests.get('http://127.0.0.1:8000/api/ray/musics/', headers={'Authorization': 'Token 22ec0cc4207ebead1f51dea06ff149342082b190'})

我的代码使用用户生成的令牌。


2

您的请求需要授权,也许会得到结果 401

假设您的请求如下:

REQ ='https://api.asite.com/something/else/else'

您有自己的令牌:
TOKEN = 'fliuzabuvdgfnsuczkncsq12454632'

按照以下方式构建您的标题:

HEADER = {'Authorization': f'{TOKEN}'}

并且像这样使用:

req.get(REQ, headers=HEADER)

请将您的结果显示如下:

req.get(COACH, headers=HEADER).json()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接