【问题标题】:Laravel API cURL Request to PythonLaravel API cURL 对 Python 的请求
【发布时间】: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


【解决方案1】:

您在本教程中遗漏了一些内容。在令牌表中有一列:

$table->string('client');

您从哪个客户发送请求很重要。我正在使用https://github.com/hisorange/browser-detect 来检测我从哪个客户端收到请求。

但现在我将尝试查看用户代理。在我的 laravel 代码中,我只是记录了每个请求,以查看以下代码发生了什么:

Route::filter('auth.token', function($route, $request)
{
....

  Log::info($request);

....
}

现在,让我们看看:

当我从命令行使用 curl 时:

curl -u user@example.com:password -X GET http://localhost:8000/account

我的用户代理是

User-Agent:   curl/7.32.0

我使用上面的代码从 python 发送了相同的内容,用户代理是:

User-Agent:      Python-urllib/2.7

啊!一定是这样的。您必须使用基本身份验证至少对用户进行一次身份验证,它会给您一个令牌,并且该令牌仅对该客户端有效。在教程的第一部分http://rjv.im/post/78940780589/api-token-authentication-with-laravel-and-sentry-part 中没有这样的条件。在我收到的 cmets 中,有人发布了关于如何支持多个客户端的问题,所以这个例子就是为了解决这个问题。

除此之外,我可以推荐这个库:https://github.com/chrisbjr/api-guard 它支持速率限制,易于与 Sentry 集成。这和我的教程有点不同。使用我的解决方案,您可以使用 Basic Auth 或 Token 访问任何端点。使用上面的库,只允许使用令牌,因此有专门的路线来生成令牌。告诉我进展如何。

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2018-06-25
    • 2016-09-17
    相关资源
    最近更新 更多