从node-webkit应用程序自动连接到Joomla站点的最佳方式

时间:2014-02-20 16:55:57

标签: android ios joomla node-webkit

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

我找到了两个解决方案,都允许通过网址登录(简单的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
  3. 两者都允许我的本地node-webkit应用程序像这样登录:

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

    但是第二个解决方案说明了这一点:

      

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

         

    [{“status”:“登录成功”,“user_id”:“982”,“用户名”:“用户”,“session_key”:“1e3fdgdt4454580ae78e2ab90f35856c17f3”}]

         
        
    1. 状态
    2.   
    3. USER_ID
    4.   
    5. 用户名
    6.   
    7. session_key可以
    8.         

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

    问题

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

2 个答案:

答案 0 :(得分:0)

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

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

Session lifetime

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

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

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

答案 1 :(得分:0)

在Joomla 3.2中测试

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

我所做的是修改了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密钥连接。