【问题标题】:python request with authentication (access_token)带有身份验证的python请求(access_token)
【发布时间】:2012-11-29 07:15:26
【问题描述】:

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

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

提供一些 json 输出。 myToken 是一个始终保持不变的十六进制变量。我想从 python 进行这个调用,以便我可以遍历不同的 id 并分析输出。有任何想法吗?在需要身份验证之前,我已经使用 urllib2 完成了此操作。我还查看了 requests 模块,但不知道该怎么做。

非常感谢。

【问题讨论】:

标签: python authentication curl access-token


【解决方案1】:

requests 包有一个非常好的用于 HTTP 请求的 API,添加自定义标头的工作方式如下 (source: official docs):

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

如果你不想使用外部依赖,同样使用标准库的 urllib2 看起来是这样的(source: the missing manual):

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

【讨论】:

  • 感谢您的回复。我已经尝试了这两种实现,我得到一个 HTTP 错误 401:未经授权。但是,命令行工作得很好。我从来没有使用过访问令牌,所以要明确一点:我拥有的令牌是 3f4264ff 等形式的 40 位数字。
  • 奇怪。让我有点烦恼的是标题中的冒号......啊!也许我(或我们俩;)只是读错了。标头可能命名为“Authorization”,其 为“access_token long_hexadecimal_string”。想试一试吗?
  • 成功了!太感谢了。我最终输入的是 url = 'website.com/id' head = {'Authorization': 'access_token hex_string'} res=requests.get(url, headers=head)
  • 此解决方案已弃用或在默认 Anaconda 安装中无法正常工作。
  • 这是一个身份验证令牌,服务器用于验证您是否有权访问 API。您需要获取要访问的 API 的客户端凭据(用户名、密码、API 密钥),然后将它们(例如,通过 get 请求)发送到身份验证服务器。服务器向您的客户端返回一个可以 JSON 编码的字符串,然后您将其用作 API 调用中的令牌。搜索 JWT 或 OAuth 以进行更多阅读并查看一些示例。
【解决方案2】:

我在尝试在 Github 中使用令牌时遇到了同样的问题。

唯一对我使用 Python 3 的语法是:

import requests

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

【讨论】:

  • 这里的令牌是什么?或者如何获取认证令牌?
【解决方案3】:

我将添加一点提示:您作为标头的键值传递的内容似乎取决于您的授权类型,在我的情况下是 PRIVATE-TOKEN

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

【讨论】:

    【解决方案4】:

    您是否尝试过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={},
    )
    

    【讨论】:

      【解决方案5】:
      >>> 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()
      

      【讨论】:

      • 这周我遇到了同样的问题,最终对我有用的是授权不记名选项。不知道为什么会有所不同,但感谢您为我提供该选项以尝试并成功开始工作!
      • @SowmiyaRagu 第二部分对我有用Bearer &lt;my_token&gt; 而第一部分则不起作用,因为响应好像请求未经过身份验证。
      【解决方案6】:
      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
          }
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 2020-01-15
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        相关资源
        最近更新 更多