具有Angular 2令牌认证的Magento 2 API

时间:2017-03-18 20:49:41

标签: api angular authentication token magento2

这是整合问题。非常感谢您的帮助(提示||指南)

我在本地安装了Angular2和Magento2(bitnami)。对于CROS,Magento conf被更改为具有正确的标题(见下文)。 我从Angular2调用Magento2获取令牌,我遇到了以下问题:

选项http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token 400(错误请求) XMLHttpRequest无法加载http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token。预检的响应具有无效的HTTP状态代码400

EXCEPTION:响应状态:URL为0:null

Angular 2方:

let headers = new Headers({'Content-type': 'application/json'});
 headers.append('Access-Control-Allow-Origin', '*');
 headers.append('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,PUT,DELETE');
 headers.append('Access-Control-Allow-Headers', 'Origin,Authorization,X-Auth-Token,Accept,Content-Type');
 headers.append('Access-Control-Allow-Credentials', 'true'); 
 let options = new RequestOptions({ headers: headers });
return this.http.post( 'http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token',
                      JSON.stringify('{"username":"angUser", "password":"angUser2017"}'),
                      options)
                      .map(res => res.json());

Magento2 API用户     angUser / angUser2017     消费者密钥:5bhvi7gjvyafcp35rajuxh0y4me2plga     消费者秘密:yh1nefyw1u80rd0ip1q6f8pijv9x72f1     访问令牌:g5plfwth2rhlwtuwfhhqp7mg6sebrxc3     访问令牌秘密:i1f4t7j65oo8ydtnteub9xr7wrswe99c

Magento标题: 响应标题 Access-Control-Allow-Credentials:True Access-Control-Allow-Headers:Origin,Content-Type,Accept,Authorization 访问控制允许方法:GET,POST,OPTIONS,PUT,DELETE Access-Control-Allow-Origin:*

1 个答案:

答案 0 :(得分:1)

之前我遇到过类似的问题,我将其跟踪到this method,其中没有检查->isOptions()。因此,来自其他域的每个API调用都会触发Request method is invalid异常。

/**
 * Retrieve current HTTP method.
 *
 * @return string
 * @throws \Magento\Framework\Exception\InputException
 */
public function getHttpMethod()
{
    if (!$this->isGet() && !$this->isPost() && !$this->isPut() && !$this->isDelete()) {
        throw new \Magento\Framework\Exception\InputException(new Phrase('Request method is invalid.'));
    }
    return $this->getMethod();
}

如果您使用的是apache,可以在github forum中找到可能的解决方法。

在我的特定情况下,我最终做的是从同一个域提供前端和api,以避免CORS出现问题(我使用nginx)。

这需要的配置示例如下:

location ~ ^/(index.php/)?rest {
  try_files $uri $uri/ /index.php?$args;
}

location / { 
  root /var/www/angular/public/;
  index index.html;
}