【问题标题】:urllib2 custom handler for token security用于令牌安全的 urllib2 自定义处理程序
【发布时间】:2016-03-18 17:43:37
【问题描述】:

我有一个 python 2.7 项目,需要利用 python 2.7 urllib2 库连接到令牌身份验证 REST 端点。表单参数如下:

{
   "username" : "<my username>",
   "password" : "<my password",
   "expiration" : <time in minutes>,
   "referer" : "<referer url>"
   "f" : "json"
}

我知道我可以做一个简单的 POST 来通过 https 取回值,但我想知道,你能扩展 urllib2.BaseHandler 类来包含这个过程吗?

我相信要做到这一点,处理程序必须知道以下内容:

  1. 令牌端点的 URL
  2. 推荐人
  3. 用户名/密码

你能定制这么多的处理程序吗?如果是这样,有人可以指出一个如何做到这一点的例子吗?

谢谢

【问题讨论】:

    标签: python python-2.7 urllib2


    【解决方案1】:

    python-requests 库非常容易。

    import requests
    from requests.auth import HTTPBasicAuth
    
    data = {
       "username" : "<my username>",
       "password" : "<my password",
       "expiration" : <time in minutes>,
       "referer" : "<referer url>"
       "f" : "json"
    }
    
    response = requests.post(url, data=data)
    # If the url requires basic http authentication.
    response = requests.post(url, auth=HTTPBasicAuth('user', 'pass'), data=data)
    # assert response.ok == True
    # response.json()
    # response.text
    
    # To perform bearer token authentication use some thing like
    auth_header = {'Authorization': 'Bearer ' + access_token}
    metadata = requests.get(
        API_URL + '/v1/users/self', headers=auth_header).json()
    

    【讨论】:

      【解决方案2】:

      定义处理程序

      import urllib2
      import urllib
      
      
      class ExtendedHandler(urllib2.BaseHandler)
              def __init__(self):
                  print "create object"
      
      
              def https_request(self,req):
                  print "Got a request"
                  req.add_data(urllib.urlencode({'username': '<username>', 'password': '<password>', 'expiration': "<time>", 'referer': "<referer>", "f" :"json"}))
                  return req
      

      您可以删除这些仅用于调试的打印语句

      如何使用上面的Handler。

      创建一个 openerDirector

      opener = urllib2.build_opener(ExtendedHandler())
      opener.open("your httpsurl")
      

      【讨论】:

      • 因此,根据您的快速示例,您正在对变量进行编码。 (顺便说一句,我没有投反对票)。
      • 所以我尝试了这个例子,但它不起作用。问题是 basehandler 似乎在发出请求时删除了现有参数。
      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多