4

第一; 这个问题类似于另一个尚未解决的问题:call to magento soap api expires immediate

我正在研究基于 XMLRPC 的客户端-服务器模块。基于 Magento 的服务器有几个 API 方法暴露给基于 Java 的客户端。我在客户端中使用标准的 Java XMLRPC Jars。

我有一个检索会话的“登录”调用。然后我将它传递给不同的调用。我检查了这是否返回(看起来像)一个有效的会话。

Object result1 = client.execute("login", ob1);
session = (String) result1;

但是,我使用此会话进行的下一个呼叫失败了:

org.apache.xmlrpc.XmlRpcException: Session expired. Try to relogin.

我已验证的内容:

  • 将 Magento 中的会话超时设置为高值
    • 这不起作用
  • 验证服务器时间设置是否正常
    • 它是。
  • 验证 API 用户在 Magento 中是否“活跃”
    • 是的。
  • 检查api_session表中的会话哈希
    • 见下文。

api_session 表

  • 这没有我当前的会话哈希。
  • 它也只有 11 个条目;我至少登录了大约 50 次。
  • 会话日志时间与select CURRENT_TIME
    • 更新:这无关紧要(MySQL 以 GMT 记录)

这是我看到的:

mysql> select * from api_session limit 50;
+---------+---------------------+----------------------------------+
| user_id | logdate             | sessid                           |
+---------+---------------------+----------------------------------+
|       5 | 2013-02-01 16:01:49 | 9099b50
|       5 | 2013-02-01 16:02:10 | 7312c1a
|       5 | 2013-02-01 16:05:43 | a6ce30c
+---------+---------------------+----------------------------------+
11 rows in set (0.00 sec)

mysql> select CURRENT_TIME;
+--------------+
| CURRENT_TIME |
+--------------+
| 14:58:03     |
+--------------+
4

1 回答 1

1

嗯....这可能是由于我自己对安全性的需要。

在上述失败中,我的登录方法从这篇文章中得到了提示:Irretrievably destroying data in Java

就像那篇文章建议的那样,我将一个 char 数组传递给 login 方法。这最终导致将空凭据传递给该login方法。

给不熟悉的人的流程是

  • 被调用的登录方法在Mage/Api/Model/Server/Handler/Abstract.php
  • 这将调用 login 方法Mage/Api/Model/Session.php
  • 我将输入转储到日志中,它们是空的。

我回到使用直接将字符串传递给该方法的常规、非安全方法。那行得通!

编辑:当然,这有一个缺点,我回到使用字符串而不是 char[] 数组。如果我弄清楚如何做到这一点,将更新答案。

于 2013-02-01T20:58:02.697 回答