【问题标题】:Authenticating an API call from Laravel验证来自 Laravel 的 API 调用
【发布时间】:2015-10-14 19:12:14
【问题描述】:

我不熟悉使用 API,目前正在尝试在我正在开发的新应用程序上使用 Trade Me API。

他们的authorisation guidelines 说他们使用 OAuth 来验证 API 调用,这些可以在查询字符串或授权标头中指定。

作为 API 调用的新手,我尝试使用 guzzlehttp/oauth-subscriber,但在尝试调用时失败了。

所以目前我只是想将详细信息附加到查询字符串中。

我尝试拨打的电话需要:

  • oauth_consumer_key
  • oauth_signature
  • oauth_signature_method

oauth_consumer_key 是消费者密钥,oauth_signature 是消费者密钥。

当我尝试访问此 URL 以测试 URL 是否正确时 - https://api.tmsandbox.co.nz/v1/Listings/123.json?oauth_consumer_key=XXX&oauth_signature=XXX&oauth_signature_method=PLAINTEXT

我收到一个错误:

"ErrorDescription":"无效的 PLAINTEXT 签名。"

我显然已经替换了上面 URL 中的密钥,但我看不出上面有什么问题,它似乎与他们的文档相匹配。

谁能指出我做错了什么?

【问题讨论】:

  • 您是否在签名后附加了 & 符号?如果您通过 Authorization 标头发送授权会更容易。尝试通过 curl 手动执行此操作:curl https://api.tmsandbox.co.nz/v1/Listings/123.json -H 'Authorization: OAuth oauth_consumer_key="<consumer-key>", oauth_signature_method="PLAINTEXT", oauth_signature="<consumer-secret>&"'。您也可以尝试在签名后添加&
  • @Dencker 好的,我稍后会尝试使用curl。我的意思是,如果我能弄清楚如何在标题中发送授权,或者如果有人可以帮助我这样做,那么我更愿意这样做。但是我无法完全理解如何通过 Laravel 做到这一点。这就是为什么我一直在寻找使用查询字符串的解决方案。
  • 您使用哪个库来发出请求?它们中的大多数,比如 Guzzle 或 Requests,都提供了一个简单的 ->addHeader("Authorization", 'OAuth oauth_consumer_key="<consumer-key>".....') 方法或类似的东西。
  • @Dencker 我使用的是Guzzle。您是否可以仅使用基本的 Guzzle 库 - github.com/guzzle/guzzle 来做到这一点,或者您是否需要使用特殊的东西,例如 github.com/guzzle/oauth-subscriber
  • 通过您在那里拨打的电话,您应该可以单独使用 Guzzle。如果您想访问特定于成员的信息,您可以只使用 Guzzle,尽管有些库提供了围绕 oauth 事务的包装器。为了更好地理解 OAuth 标准,我建议您尝试手动进行几次身份验证,然后继续使用一些包装库。这将使您更好地了解幕后发生的事情。

标签: php api laravel oauth


【解决方案1】:

假设您使用 Guzzle 和 Laravel,正如 cmets 所述,这将是一个非常简单的示例,说明如何实现这一点(只需将其放入 routes.php):

Route::get( '/', function ()
{
    $client = new GuzzleHttp\Client( ["base_uri" => "https://api.tmsandbox.co.nz/v1/"] );

    $response = $client->request( "GET", "Listings/123.json", ["headers" => ["Authorization" => 'OAuth oauth_consumer_key="YOUR-CONSUMER-KEY", oauth_signature_method="PLAINTEXT", oauth_signature="YOUR-CONSUMER-SECRET&"']] );

    return Response::json($response->getBody()->getContents());
} );

【讨论】:

  • 当我运行这个时,我得到一个错误Class 'Guzzle\Http\Client' not found。在我的composer.json 中,我使用的是"guzzlehttp/guzzle": "~6.0",这是正确的版本吗?
  • 改用GuzzleHttp\Client
  • 啊,上面的例子是"guzzle/guzzle": "^3.9"(已弃用)。我去吃点东西,然后我会重写这个例子。
  • 我知道得到错误Argument 1 passed to GuzzleHttp\Client::__construct() must be of the type array, string given, called in C:\wamp\www\tmapi\app\Http\routes.php on line 26 and defined。当我运行curl 代码时,您首先评论它工作正常。如果你更容易测试,我可以给你消费者密钥和消费者秘密。它们仅适用于沙盒应用程序,而不是实时密钥,因此没有任何危害,我可以稍后重新生成它们以确保安全?
  • 感谢 Dencker,如果您发现需要消费者密钥和消费者秘密来让事情变得更轻松,请告诉我。很高兴将它们传递出去,因为它仅适用于沙盒应用程序。
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2021-02-13
  • 2019-10-25
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多