Laravel API cURL请求Python
我遵循这个Laravel令牌API教程:http://rjv.im/post/95988160186/api-token-authentication-with-laravel-and-sentry-part。我写了以下cURL请求与我的API进行通信:Laravel API cURL请求Python
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-验证令牌的用户凭据,要求按预期工作:
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()
任何援助将非常感激。
在教程中有一些你错过了。在代码表有一栏:
$table->string('client');
它是从哪个客户要发送你的要求很重要。我正在使用https://github.com/hisorange/browser-detect来检测我从哪个客户端获得请求。
但现在我只想看看用户代理。在我laravel代码,我只是记录每一个请求,看看有什么用下面的代码发生的事情:
Route::filter('auth.token', function($route, $request)
{
....
Log::info($request);
....
}
现在,让我们来看看:
当我使用卷曲的命令行:
curl -u [email protected]:password -X GET http://localhost:8000/account
我User Agent is
User-Agent: curl/7.32.0
我使用上面的代码从python发送了相同的消息,User Agent是:
User-Agent: Python-urllib/2.7
啊!那一定是吧。您必须使用基本身份验证至少验证一次用户身份,它会为您提供一个令牌,并且该令牌仅对该客户端有效。在教程的第一部分http://rjv.im/post/78940780589/api-token-authentication-with-laravel-and-sentry-part中没有这种情况。在我收到的评论中,有人发布了关于如何支持多个客户端的查询,所以这个例子是为了解决这个问题。
除此之外,我可以建议这个库:https://github.com/chrisbjr/api-guard它支持速率限制,易于与Sentry集成。这与我的教程有点不同。使用我的解决方案,您可以使用基本身份验证或令牌来打任何终端。使用上面的库,只允许令牌,所以有专门的路由来生成令牌。让我知道事情的后续。
首先,您如何解析服务器端的X-Auth-Token标头?因为通常情况下,标题是在冒号后用一个空格发送的 - 这就是curl将发送所有其他头文件的方式,以及urllib2将如何发送所有头文件,包括您添加的头文件。如果你的服务器实际上期望''X-Auth-Token:tokenhere''并拒绝''X-Auth-Token:tokenhere'',那么你需要修正服务器端的错误。 – abarnert 2014-11-21 22:38:36
其次,为了调试这个,你需要先看看你发送的内容是不同的。你可以让你的服务器记录完整的请求,以便比较它们吗?或者在Wireshark中查看它们?或者只是运行'nc -kl 8000'而不是你的服务器,并且当你的'curl'命令和Python程序试图与它对话时,看它打印出来的内容? – abarnert 2014-11-21 22:39:41
最后,大多数auth-token机制都有TTL /到期/等等。 curl命令是否在Python脚本失败后正常工作,或者在过去是否正常工作? – abarnert 2014-11-21 22:42:06