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

标签 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
  {
    // ????????????????????
  }
?>

我有多个应用程序,用户可以使用这些应用程序登录他们的帐户,因此我试图让这个 Web 服务成为我的应用程序系列的“通用”服务。此 PHP 服务中的所有内容都运行良好。您通过 HTTPS POST 将用户凭据发送到正确的 url,它对其进行身份验证,然后根据身份验证是否成功正确路由到末尾的 if-else。

我被绊倒的地方是我需要在该 Web 服务的另一端做的事情。例如,假设我的简单 electron/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>

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

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

我理想的情况是将用户名和密码扔到栅栏的另一边,然后网络服务将返回真或假,连同一些其他信息,给应用程序。这样,Web 服务处理身份验证,应用程序根据成功/失败处理需要完成的操作。显然,我正在努力确保从头到尾的安全。

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

最佳答案

为什么不在 PHP 中实现 OAuth,请查看 link更多细节。正如您所说,您想将它用于多个 Web 应用程序,所以我认为 OAuth 是最好的。

关于javascript - 如何创建可从多个应用程序使用的 PHP 登录 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018481/

相关文章:

javascript - 将 url 传递给 getJSON

javascript - 将数据主题添加到所有项目

javascript - 即使在 if 语句中包装后,Flow 仍认为该值为 null

php - mysql select 不提取任何行,因为 %[$variable]% 搞砸了

python - bs4 findAll 找不到类标签

javascript - 根据 $_Session 值获取选项 '' selected''

javascript - AngularJS 复选框奇怪的行为

php - 如何初始化一个PHP二维数组

javascript - wordpress博客动态背景图片

html - Img 在 IE 和 FF 中溢出固定宽度的 div