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

Posted

技术标签:

【中文标题】Python请求库如何使用单个令牌传递授权标头【英文标题】:Python requests library how to pass Authorization header with single token 【发布时间】:2013-10-04 20:51:23 【问题描述】:

我有一个请求 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>'))

但这些都不起作用。

【问题讨论】:

【参考方案1】:

在python中:

('<MY_TOKEN>')

等价于

'<MY_TOKEN>'

请求解释

('TOK', '<MY_TOKEN>')

因为您希望请求使用基本身份验证并像这样制作授权标头:

'VE9LOjxNWV9UT0tFTj4K'

'TOK:&lt;MY_TOKEN&gt;' 的 base64 表示形式

要传递您自己的标题,您可以像这样传递字典:

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

【讨论】:

回溯(最近一次调用最后):文件“”,第 1 行,在 文件“/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 行,在请求 prep = self.prepare_request(req) @rebHelium 你能gist那个吗?这不是整个堆栈跟踪,也没有迹象表明您实际尝试了什么。 抱歉,Stack Overflow 不允许我发布整个输出。我完全按照你的建议做了:r = requests.get('whatever url i have', headers='Authorization': 'TOK:whatever token i have') 无需道歉。它奏效了吗?您接受了我的回答,但似乎对您造成了例外。如果您创建gist,我可以帮助您比在此处进行对话更轻松。 这行得通!确保 Authorization 的拼写正确。我用它作为授权,请求失败。【参考方案2】:

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

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

希望这对某人有帮助:)

【讨论】:

如果你尝试r = requests.get('&lt;MY_URI&gt;',auth=('&lt;MY_TOKEN&gt;')),你会得到TypeError: 'str' object is not callable。这让我难倒了一段时间,直到我遇到了这个:/ 您的回答对我有所帮助,但只有在阅读了您提供的链接后才能访问。使用从 requests.auth 导入的 HTTPBasicAuth 非常简单!【参考方案3】:

你可以试试这样的

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

【讨论】:

【参考方案4】:

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

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

with requests.Session() as s:

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

【讨论】:

【参考方案5】:

这对我有用:

access_token = #yourAccessTokenHere#

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

【讨论】:

【参考方案6】:

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

另一种方法是制定一个自定义标题,正如其他用户在这里所建议的那样。

【讨论】:

【参考方案7】:

我在这里成立,我可以使用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()

【讨论】:

【参考方案8】:

这对我有用:

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

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

【讨论】:

【参考方案9】:

您有一个需要授权的请求,也许您有一个结果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()

【讨论】:

以上是关于Python请求库如何使用单个令牌传递授权标头的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 请求模块创建自定义标头

如何在反应本机中使用 XMLHttpRequest 在 GET 方法的标头中传递授权令牌

如何将承载令牌添加到 HTTP 请求的标头?

如何在传入的http请求标头中添加授权令牌[关闭]

如何在 Android OKHTTPClient 请求上设置(OAuth 令牌)授权标头

如何在 Android OKHTTPClient 请求上设置(OAuth 令牌)授权标头