如何创建可以从多个应用程序使用的PHP登录Web服务?

时间:2016-05-04 04:28:08

标签: javascript php html http authentication

我使用php编写了以下身份验证Web服务:

authenticate.php

<?php      
  require('_includes.php');
  $username = fetchPostParam('username');
  $password = fetchPostParam('password');

  // A higher "cost" is more secure but consumes more processing power
  $cost = 10;

  $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

  // this is so php can recognize / verify this later. "$2a$" Means we're using the Blowfish algorithm. The following two digits are the cost parameter.
  $salt = sprintf("$2a$%02d$", $cost) . $salt;
  $hash = crypt($password, $salt);

  //grab the username/password from the database
  $mysqli = getMysqlConnection();
  if (mysqli_connect_errno()) {printf("Connect failed: %s\n", mysqli_connect_error());exit();}
  $query = "SELECT * FROM usercreds where username = '{$username}'";
  if ($result = $mysqli->query($query)) {
      while ($row = $result->fetch_assoc()) {
        $dbusername = $row["username"];
        $dbhash = $row["hash"];
      }
      $result->close();
  }
  $mysqli->close();
  if($username == $dbusername && password_verify($password, $dbhash))
  {
    // ????????????????????
  }
  else
  {
    // ????????????????????
  }
?>

我有多个应用程序,用户可以使用这些应用程序登录他们的帐户,所以我试图让这个网络服务成为一种普遍的&#34;对于我的应用程序系列。这个PHP服务中的一切都运行正常。您通过HTTPS POST将用户凭据发送到正确的URL,它会对它们进行身份验证,然后根据身份验证是否成功正确路由到最后的if-else。

我被绊倒的地方是我需要在此网络服务的另一端做的事情。例如,假设我的简单电子/ node.js应用程序中有此登录表单:

<form id="loginform" method="POST" action="https://localhost:8888/webservices/authenticate.php">
  <input type="text" name="username" id="username_field" placeholder="Username"/><br />
  <input type="password" name="password" id="password_field" placeholder="Password"/><br />

  <button type="submit" id="login_button">Let's do this!</button><br />
</form>

您可以看到此表单的操作是之前的authenticate.php,我们正在使用POST方法。但是(正如预期的那样),当用户提交他们的用户名/密码时,页面会物理地路由到authenticate.php,如果我们要从许多不同的网站上获取此Web服务,这不是一件好事。应用

我也尝试过通过jQuery使用ajax调用。然而,这有一个明显的缺点,即使一个稍微精明的程序员,如果他们在javascript中设置正确的断点,也可以看到明文密码。

我理想的情况是将用户名和密码扔到围栏的另一侧,然后webservice将向应用程序返回true或false以及其他一些信息。这样,Web服务处理身份验证,应用程序根据成功/失败处理需要完成的操作。显然,我试图从头到尾努力保证这一点。

如何根据我的布局实现这种登录/身份验证过程?

1 个答案:

答案 0 :(得分:0)

为什么不在PHP中实施OAuth,请查看link了解更多详情。如您所说,您想将它用于多个Web应用程序,因此我认为OAuth是最好的。