Magento REST API,用户授予管理员角色但仅授予访客访问权限
Posted
技术标签:
【中文标题】Magento REST API,用户授予管理员角色但仅授予访客访问权限【英文标题】:Magento REST API, User given admin role but only granted Guest access 【发布时间】:2013-08-09 13:45:39 【问题描述】:我正在用 python 编写一个使用 OAuth/REST 等访问 Magento 服务器的应用程序。
OAuth 身份验证已完成,我有两个消费者令牌和两个访问令牌。在 Magento 本身中,我遵循了许多博客中概述的配置步骤 - 设置 REST 角色、属性和使用者以及用户权限和角色。我已经检查了 500 次(感觉就是这样!)并且看不到任何错误,用户正在使用具有授权令牌的 REST 消费者,用户的角色是管理员,等等。
在完成 OAuth 流程后,我尝试将产品发布到 Magento(其数据库为空)并收到 403 Access Denied 错误时,我注意到出现了问题。 Get 尝试收到相同的结果。我为访客启用了 REST API 访问,现在 Get 收到一个空的 json 数组,当然 Post 仍然有 403 - 这告诉我 Magento 没有查看 OAuth 令牌并让我登录。
Magento 似乎拒绝接受它在 OAuth 身份验证过程中生成的消费者/访问令牌。
是否有我遗漏的配置步骤,或者有什么信息可以帮助我克服这个障碍?
编辑:下面添加的代码 sn-p 显示了我用来查询 Magento 的方法:-
from rauth.session import OAuth1Session
session = OAuth1Session(consumer_key, consumer_secret, access_key, access_secret)
headers = 'Content-Type': 'application/json', 'Accept': 'application/json'
r = session.get('http://mysite.com/api/rest/products', headers=headers)
print r.json()
输出:u'messages': u'error': [u'message': u'Access denied', u'code': 403]
【问题讨论】:
【参考方案1】:经过几个小时的思考这个问题,我终于意识到为什么我们中的一些人会收到以下错误:
Invalid auth/bad request (got a 403, expected HTTP/1.1 20X or a redirect)
"messages":"error":["code":403,"message":"Access denied"]
即使在成功授权管理员/客户之后。
不幸的是,问题不在于 Magento,而很可能是您的服务器配置。
我开始研究 Magento Api2 代码并意识到他们正在使用 Zend_Controller_Request_Http 方法“getHeader”来检查 oAuth 授权。
以下是“getHeader()”的代码
public function getHeader($header)
if (empty($header))
#require_once 'Zend/Controller/Request/Exception.php';
throw new Zend_Controller_Request_Exception('An HTTP header name is required');
// Try to get it from the $_SERVER array first
$temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
if (isset($_SERVER[$temp]))
return $_SERVER[$temp];
// This seems to be the only way to get the Authorization header on
// Apache
if (function_exists('apache_request_headers'))
$headers = apache_request_headers();
if (isset($headers[$header]))
return $headers[$header];
$header = strtolower($header);
foreach ($headers as $key => $value)
if (strtolower($key) == $header)
return $value;
return false;
Magento 类“Mage_Api2_Model_Auth_Adapter_Oauth”传递给这个函数的是:
public function isApplicableToRequest(Mage_Api2_Model_Request $request)
$headerValue = $request->getHeader('Authorization');
return $headerValue && 'oauth' === strtolower(substr($headerValue, 0, 5));
由于调用的是"$request->getHeader('Authorization'),也就是说getHeader函数中的$header var是"Authorization"
// Try to get it from the $_SERVER array first
$temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
if (isset($_SERVER[$temp]))
return $_SERVER[$temp];
Zend 类然后将 "Authorization" 转换为 "HTTP_AUTHORIZATION" 并在 $_SERVER 数组中查找它,这就是问题所在,因为在该数组中授权值位于 "$_SERVER['Authorization']"不是 "$_SERVER['HTTP_AUTHORIZATION"]",他们这样做是因为其他变量(例如 CONTENT_TYPE)存储为 HTTP_CONTENT_TYPE,授权除外。
然而,Zend 似乎意识到了这一点,因此他们编写了以下代码:
// This seems to be the only way to get the Authorization header on
// Apache
if (function_exists('apache_request_headers'))
$headers = apache_request_headers();
if (isset($headers[$header]))
return $headers[$header];
$header = strtolower($header);
foreach ($headers as $key => $value)
if (strtolower($key) == $header)
return $value;
这里的问题是那里的许多服务器没有启用“apache_request_headers”,如果您遇到这个问题,很可能您的托管公司禁用了“apache_request_headers”。
这里有两种解决方案:
-
联系您的主机并要求他们启用“apache_request_headers”。
修改 Zend_Controller_Request_Http 类中的 getHeader($header) 函数
替换:
$temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
与:
$temp = ($header == 'Authorization') ? $header : 'HTTP_' . strtoupper(str_replace('-', '_', $header));
【讨论】:
这是金! 7 年后我仍然遇到同样的问题,突然从 Magento REST API 获得 403 Forbidden,这已经为我解决了,谢谢!【参考方案2】:如上例所示,我无法使用 rauth 库找到解决方案,但能够使用 oauthlib/requests_oauthlib 使其正常工作,如下所示:-
from requests_oauthlib import OAuth1 as OAuth
import requests
oauth = OAuth(client_key=consumer_key, client_secret=consumer_secret, resource_owner_key=access_key, resource_owner_secret=access_secret)
h = 'Content-Type': 'application/json', 'Accept': 'application/json'
r = requests.get(url='http://mysite.com/api/rest/products', headers=h, auth=oauth)
print r
print r.content
print r 生成“”,r.content 包含 json 格式的产品列表。
我推测 rauth 错误地计算了 nonce 值,或者编码可能已关闭 - 它产生的请求中的某些内容让 Magento 感到不安,因此拒绝授予访问权限。
【讨论】:
以上是关于Magento REST API,用户授予管理员角色但仅授予访客访问权限的主要内容,如果未能解决你的问题,请参考以下文章