我使用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服务处理身份验证,应用程序根据成功/失败处理需要完成的操作。显然,我试图从头到尾努力保证这一点。
如何根据我的布局实现这种登录/身份验证过程?