Python请求库如何通过单个令牌传递Authorization标头


95

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

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

等等,我得到200并查看相应的JSON数据。因此,我安装了请求,并且当我尝试访问该资源时,我得到了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>'))

但是这些都不起作用。

Answers:


112

在python中:

('<MY_TOKEN>')

相当于

'<MY_TOKEN>'

并要求翻译

('TOK', '<MY_TOKEN>')

当您希望请求使用基本身份验证并设计一个授权标头时,如下所示:

'VE9LOjxNWV9UT0tFTj4K'

这是base64的表示形式 'TOK:<MY_TOKEN>'

要传递自己的标头,您需要像这样传递字典:

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

追溯(最近一次通话):<模块>中第1行的文件“ <stdin>”,文件“ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api” .py“,第55行,位于get return 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行,在请求准备中= self.prepare_request(req)

@rebHelium可以要点是什么?那不是整个堆栈跟踪,也没有迹象表明您实际尝试过什么。
伊恩·斯台普顿

抱歉,Stack Overflow不允许我发布整个输出。我按照您的建议做了:r = request.get('我拥有的所有URL',headers = {'Authorization':'TOK:我拥有的所有令牌'})

不用道歉。奏效了吗?您接受了我的回答,但这似乎为您带来了例外。如果您创建要点,那么与在这里进行对话相比,我可以为您提供更多的方便。
伊恩·斯台普顿·科尔达斯科

Sigma,我实际上错过了导致错误的代码上的一个小细节。实际的代码是机密的,所以我不能说清楚。但是,如果您愿意的话,我会提出其他问题,因为我想提高自己的Python技能。我敢肯定,他们是非常简单的问题。

37

我一直在寻找类似的东西,并且遇到了这个问题。看来您提到的第一个选项

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

希望这对某人有帮助:)


3
如果你尝试r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')),你会得到的TypeError: 'str' object is not callable。那让我
难过

您的服务对象帮助了我,但只有在您阅读了您提供的链接后才获得了认可。使用来自request.auth的HTTPBasicAuth导入非常容易!
Wallem89 '19

26

这为我工作:

access_token = #yourAccessTokenHere#

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

16

您还可以设置整个会话的标题:

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

with requests.Session() as s:

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

4

请求本身仅通过用户传递参数而不是令牌支持基本身份验证。

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

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

我在这里建立了,我可以 在这里登录: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()

2

您可以尝试这样的事情

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

0

这为我工作:

r = requests.get('http://127.0.0.1:8000/api/ray/musics/', headers={'Authorization': 'Token 22ec0cc4207ebead1f51dea06ff149342082b190'})

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.