【问题标题】:Using Magento Rest API with angularjs and OAuth将 Magento Rest API 与 angularjs 和 OAuth 一起使用
【发布时间】:2015-01-14 21:59:31
【问题描述】:

编辑: TL;DR
有没有人将 Magento Rest API 与 angularjs 一起使用,并且可以给我一些关于如何开始使用 OAuth 的提示?

我正在尝试将 magento Rest API 与 angularjs 一起使用。我的问题是我什至没有让启动端点工作。

计算我使用https://github.com/bettiolo/oauth-signature-js的签名:

var initEndpointUrl = "http://magentoserver.com/oauth/initiate"

var parameters = {
    oauth_callback: callback,
    oauth_consumer_key : consumerKey,
    oauth_nonce : nonce,
    oauth_signature_method : signatureMethod,
    oauth_timestamp : timestamp            
}

var signature = oauthSignature.generate('POST', initEndpointUrl, parameters, consumerSecret);

我尝试了两种不同的方法:

1:发送带有Authorization Header的参数:

var authHeader = "OAuth "+ 
    "oauth_callback=" + callback + "," +
    "oauth_consumer_key=" + consumerKey + "," +
    "oauth_nonce=" + nonce + "," +
    "oauth_signature_method=" + signatureMethod +  "," +
    "oauth_timestamp=" + timestamp + "," +
    "oauth_signature=" + signature;   

$http({
    method: 'POST',
    url: initEndpointUrl,
    header: {
        'Authorization': authHeader
    }
})

这种方法的问题是,我从服务器收到 OPTIONS 方法的 400 Bad Request。这是由于 Authentication 标头导致请求不是“简单请求”造成的(据我所知)。这在飞行前会调用 OPTIONS 方法。

2:将参数作为url参数发送:

http://magentoserver.com/oauth/initiate?
    oauth_callback=http%3A%2F%2Flocalhost&
    oauth_consumer_key=12345&
    oauth_nonce=67890&
    oauth_signature_method=HMAC-SHA1&
    oauth_timestamp=1234567890&
    oauth_signature=abcdefg1234567 

使用这种方法,我取得了更大的成功,并且能够添加所有必需的参数,直到检查签名,这导致 401 oauth_problem=signature_invalid

我对 OAuth 很陌生,所以我想生成签名的调用可能不正确。另一方面,我可以想象,通过更改参数(以及 URL),我会使签名无效。

有人有这方面的经验吗?提前致谢!

PS:我已经在https://magento.stackexchange.com/ 上发布了这个,因为我认为它会更具体。

【问题讨论】:

  • 我用several signature testers 测试并尝试了各种不同的东西。 Magento 仍然说签名无效。 oauth_callback 用其他参数签名是否正确?
  • 您肯定希望使用标题而不是将所需项目作为参数传递。引起我注意的第一件事是您的标题格式错误。每个变量都必须用双引号括起来,因此您必须转义设置的引号或执行此操作 'oauth_signature="' + signature + '"';。注意单引号和双引号的使用。
  • 感谢您的评论。我试过了,但如果我不使用参数,我仍然会遇到在浏览器中测试时遇到的 OPTIONS 问题。

标签: angularjs api rest magento oauth


【解决方案1】:

我只是在 PHP 中使用 OAuth。希望对你有所帮助。

查看此示例链接。当使用 'oauth/initiate' 时,oauth_callback 包含在 URL 中。两边都写

http://www.magentocommerce.com/api/rest/authentication/oauth_authentication.html#OAuthAuthentication-PHPExamples

我看到其他 OAuth 标头使用双引号将每个值作为 oauth_signature_method="HMAC-SHA1"

【讨论】:

  • 感谢您的回答。我只是尝试了两者(双引号并将编码的 URL 放入 url 参数)。我知道这个例子,但它并没有太大帮助,因为我必须自己创建随机数、时间戳,最重要的是签名。这可能很容易成为我犯错的地方。另外我认为这可能与飞行前的 OPTIONS 通话有关...
【解决方案2】:

在 Nic Raboy 的大力帮助下,我们将其包含在他的 OAuth 库中:

ng-cordova-oauth

库完成所有的签名、nonce 计算和其他所有需要的事情。但是它确实需要在 cordova 上运行(使用 inAppBrowser 插件)。

在此之前,必须对 Magento 进行一些修复:

OAuth activation if initiate directs to 404

OAuth fix for missing form_key

OAuth fix for redirecting to dashboard

最后一个没有立即生效,但这是正确的方向。如果有人对此有任何疑问,请随时提问。我真的很惊讶它花了这么多精力让它运行。

谢谢 Nic,现在很容易获得 access_token :)

【讨论】:

  • 总结一下。 oauth_callback 必须包含在请求令牌标头中,并且访问令牌请求必须由客户端密钥和从请求令牌获得的令牌密钥签名。
  • 当我在决定是否使用标头参数或 url 参数时,我想指出,在此解决方案中,oauth_callback 参数在标头中传输一次,并作为 url 参数传输一次。尚未测试是否需要这样做。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2013-07-21
  • 2016-07-16
相关资源
最近更新 更多