2014-11-21 156 views
0

我遵循这个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() 

任何援助将非常感激。

+0

首先,您如何解析服务器端的X-Auth-Token标头?因为通常情况下,标题是在冒号后用一个空格发送的 - 这就是curl将发送所有其他头文件的方式,以及urllib2将如何发送所有头文件,包括您添加的头文件。如果你的服务器实际上期望''X-Auth-Token:tokenhere''并拒绝''X-Auth-Token:tokenhere'',那么你需要修正服务器端的错误。 – abarnert 2014-11-21 22:38:36

+0

其次,为了调试这个,你需要先看看你发送的内容是不同的。你可以让你的服务器记录完整的请求,以便比较它们吗?或者在Wireshark中查看它们?或者只是运行'nc -kl 8000'而不是你的服务器,并且当你的'curl'命令和Python程序试图与它对话时,看它打印出来的内容? – abarnert 2014-11-21 22:39:41

+0

最后,大多数auth-token机制都有TTL /到期/等等。 curl命令是否在Python脚本失败后正常工作,或者在过去是否正常工作? – abarnert 2014-11-21 22:42:06

回答

1

在教程中有一些你错过了。在代码表有一栏:

$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集成。这与我的教程有点不同。使用我的解决方案,您可以使用基本身份验证或令牌来打任何终端。使用上面的库,只允许令牌,所以有专门的路由来生成令牌。让我知道事情的后续。