【问题标题】:Best way to auto-connect to Joomla site from node-webkit app从 node-webkit 应用程序自动连接到 Joomla 站点的最佳方式
【发布时间】:2014-02-20 16:55:56
【问题描述】:

我正在构建一个 node-webkit 应用程序,每隔几分钟就会向我的 Joomla 站点发布一个日志条目。我对在我的应用中存储用户名/密码持怀疑态度。

我找到了两个解决方案,都允许通过 URL 登录(简单的 GET 内容)。

  1. Simple component that handles authentication via GET
  2. API for using external Apps and Sites to communicate/login/register to a Joomla site

两者都允许我的本地 node-webkit 应用程序像这样登录:

http://www.mysite.com/index.php?option=com_test&username=foo&password=foo

但第二种解决方案是这样说的:

如果获得成功,我的意思是如果信息正确,那么您将获得以下信息:

[{"status":"登录成功","user_id":"982","username":"user","session_key":"1e3fdgdt4454580ae78e2ab90f35856c17f3"}]

  1. 状态
  2. user_id
  3. 用户名
  4. session_key

您可以将所有信息存储在您的应用中以备下次使用。

问题

存储会话密钥是否允许我在未来登录网站,即使是在第一次登录后几天?我试过四处寻找,但找不到答案。或者我应该使用某种本地加密存储登录凭据。再说一遍 - 这是 node-webkit,所以我不确定我可以存储的东西有多安全。

【问题讨论】:

    标签: android ios joomla node-webkit


    【解决方案1】:

    我不确切知道通过 GET 处理身份验证的插件的内部功能,但总体思路是这样的:

    • 当您登录时,基本上会生成一个会话并且您会收到该会话的密钥。基本上浏览器会将它作为 cookie 发送回来,Joomla 会知道它是同一个用户。 会话有效,只要它没有过期(检查您的 Joomla 安装设置)。当会话到期时,它将从数据库中删除。因此,如果会话有效期为几天,您应该能够登录。

    • 我最近没有检查确切的实现,但据我所知,会话对浏览器用户代理/IP(不确定 IP)敏感。这意味着如果您的环境发生变化,会话检查将失败,您需要重新登录。

    • 理想情况下,您不希望将会话存储太长时间。如果您这样做不是非常时间敏感或不经常这样做,我会重新登录每次我需要。

    • 如果身份验证部分不适合您,请考虑另一种方法(不理想,但它可能适合您):您将组件/API 入口点设为公开(所以您不需要进行身份验证)并在您的请求中发送一个密钥(基于令牌的身份验证),您在保存数据/执行操作之前检查 PHP。因此,每次安装都有一个唯一的密钥,您可以将网站上的密钥插入到您的应用中(作为设置)。

    【讨论】:

    • 这是在正确的轨道上@Valentin。让我对此进行研究并回复您。非常感谢。
    • 感谢@Valentin 提供的见解。当然,基于 API 密钥令牌的身份验证是可行的方法,但现在我已经发布了一个答案,说明我如何让脚本让我登录,而不仅仅是对我进行身份验证。这对我在规划整个 API 系统时构建我的 node-webkit 应用程序很有用。
    【解决方案2】:

    在 Joomla 3.2 中测试

    我在问题中发布的两个脚本只完成了我想要的一半。 IE。他们只检查登录凭据是否有效,返回一条消息,没有做任何其他事情。

    我所做的是修改hocoi 的脚本以使我也登录。注意:这发生在您经过身份验证并确保用户提供了正确的详细信息之后。然后,要登录用户,只需使用 JFactory::getApplication()->login($credentials) 方法,如下所示:

    $credentials = array();
    $credentials['username'] = $username;
    $credentials['password'] = $password1;
    
    JFactory::getApplication()->login($credentials);
    

    我还发现了这段代码,它会在您登录后添加必要的标头 cookie。如果您打算保持登录,这将很有用。

    if(!isset($_COOKIE['jsid'])){
        $user = & JFactory::getUser();        
        $temp_session = $_SESSION; // backup all session data
        session_write_close();
        ini_set("session.save_handler","files"); // set session saved hadler on file
        session_start();
        $_SESSION = (array)$temp_session['__default']['user']; // data that another php file need to know
        session_write_close();
        ini_set("session.save_handler","user"); // put back session saved handler on database
        $jd = new JSessionStorageDatabase();
        $jd->register(); // set required parameters
        session_start(); // restart //
        $_SESSION = $temp_session; // restore last session data
        $e = session_id();
        setcookie("jsid", $e, time()+3600,'/');
    }
    

    作为@Valentin 的回答,您可能希望为此创建一个基本 API。像这样的远程登录确实应该是最后的手段。我将它用作本地应用程序的入口点,以通过 API 密钥进行连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 2017-03-12
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多