【问题标题】:Python - urllib2 how to know if our authorization is successfulPython - urllib2 如何知道我们的授权是否成功
【发布时间】:2014-09-17 09:59:19
【问题描述】:

当您通常登录网站时,我们可以使用 urllib2.Request 。

import urllib2, base64
req = urllib2.Request("http://www.facebook.com/")
base64string = base64.encodestring("%s:%s" % ("username", "password")).replace("\n", "")
req.add_header("Authorization", "Basic %s" % base64string)
requested = urllib2.urlopen(req)

但是我们怎么知道授权是否成功呢?因为您可能只是打开了错误授权的 URL。

【问题讨论】:

    标签: python login request authorization urllib2


    【解决方案1】:

    当您未获得授权并返回 401 状态时会引发 urllib2.HTTPError 异常:

    >>> import urllib2, base64
    >>> req = urllib2.Request('http://httpbin.org/basic-auth/foouser/barpw')
    >>> base64string = base64.encodestring("%s:%s" % ("username", "password")).replace("\n", "")
    >>> req.add_header("Authorization", "Basic %s" % base64string)
    >>> urllib2.urlopen(req)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 127, in urlopen
        return _opener.open(url, data, timeout)
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 410, in open
        response = meth(req, response)
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 523, in http_response
        'http', request, response, code, msg, hdrs)
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 448, in error
        return self._call_chain(*args)
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 382, in _call_chain
        result = func(*args)
      File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 531, in http_error_default
        raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
    urllib2.HTTPError: HTTP Error 401: UNAUTHORIZED
    

    成功授权后,您将获得一个响应对象:

    >>> req = urllib2.Request('http://httpbin.org/basic-auth/foouser/barpw')
    >>> base64string = base64.encodestring("%s:%s" % ("foouser", "barpw")).replace("\n", "")
    >>> req.add_header("Authorization", "Basic %s" % base64string)
    >>> response = urllib2.urlopen(req)
    >>> response.getcode()
    200
    

    【讨论】:

    • 我没有得到正确或错误身份验证的 urllib2.HTTPError 异常?当我尝试使用错误的密码连接到路由器(默认网关)时,我只会收到异常错误。请帮帮我。
    • 那么 specific 服务器没有响应 401 错误,而是在 200 错误页面中给你一条消息,或者他们可能已经重定向了你。回复内容是什么?
    • 我在 facebook 上完成了这个,代码是 200 正确或错误,正确和错误身份验证的 .geturl() 是 facebook.com。我还打印了 .info() 并没有太大区别,只是不同的“Set-Cookie”标头等,但没有关于拥有正确的身份验证。
    • @user3818650:Facebook 不使用基本身份验证,他们使用 cookie 会话。
    • @user3818650:当然,小心和耐心。这取决于您正在处理的确切登录表单;它使用 CSRF 令牌吗?服务器是否期望某些带有 POST 的标头(找出的唯一方法是尝试)等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2011-08-10
    • 2010-11-02
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多