【发布时间】:2015-01-20 04:12:25
【问题描述】:
我遵循了这个 Laravel 令牌 API 教程:http://rjv.im/post/95988160186/api-token-authentication-with-laravel-and-sentry-part。我编写了以下 cURL 请求来与我的 API 进行通信:
curl -H "X-Auth-Token:tokenhere" http://localhost:8000/account
请求正常工作,准确返回预期数据。当我将其翻译成 Python 时,我会收到 urllib2.HTTPError: HTTP Error 401: Unauthorized
import urllib2
req = urllib2.Request('http://localhost:8000/account')
req.add_header("X-Auth-Token", "tokenhere")
resp = urllib2.urlopen(req)
content = resp.read()
print content
如果我使用基本身份验证而不是 X-Auth-Token 传递用户凭据,则请求会按预期工作:
import urllib2
def basic_authorization(user, password):
s = user + ":" + password
return "Basic " + s.encode("base64").rstrip()
req = urllib2.Request("http://localhost:8000/account", headers = { "Authorization": basic_authorization("usernameHere", "passwordHere"), })
f = urllib2.urlopen(req)
print f.read()
任何帮助将不胜感激。
【问题讨论】:
-
首先,您是如何解析服务器端的
X-Auth-Token标头的?因为通常情况下,标头在冒号后带有一个空格——curl将如何发送所有其余标头,urllib2将如何发送 所有 标头,包括你添加的那个。如果您的服务器实际上期待'X-Auth-Token:tokenhere'并拒绝'X-Auth-Token: tokenhere',这是您需要在服务器端修复的错误。 -
其次,为了调试它,您需要首先查看您发送的不同之处。你能让你的服务器记录完整的请求,以便你可以比较它们吗?或者在 Wireshark 中查看它们?或者只是运行
nc -kl 8000之类的东西而不是你的服务器,然后看看当你的curl命令和Python 程序尝试与之对话时它会打印什么? -
最后,大多数 auth-token 机制都有一个 TTL/expiration/etc。
curl命令即使在 Python 脚本失败后仍然有效,还是只是在过去有效?
标签: php python api curl laravel