PHP REST API 的安全方式?



我正在开发基于PHPRESTapi。我有安卓应用程序,它会将一些关键参数发送到服务器,服务器将响应数据。在这种情况下,电子邮件是获取所有相关数据的关键元素。如果我想使其安全,我可以将密码保存在sharedPreferences中,并在每次请求时发送。这可能会使通信安全,但我知道sharedPreferences不安全,不建议将机密信息放入其中。此外,我无法在sharedPreferences中存储密码哈希,因为我phpapi 中使用password_hash()函数,该函数需要纯文本形式的密码。因此,我必须仅以纯文本密码发送请求。我应该怎么做才能使其安全?

像这样的事情是正常的,通常是使用某种形式的令牌身份验证。

但是,您可能想了解有关安全性的更多信息,除非您正在做的是仅打算使用的玩具应用程序。话虽如此,PHP 在处理会话方面非常出色,因此您可以考虑在您的应用程序中使用 cookie jar 并利用会话。REST 纯粹主义者可能会因为这个建议而绞死我,但你知道吗?只要您将仅将 API 用于您的应用程序,它就可以完美运行。

另一个快速简便的解决方案是从您的应用程序进行正常的电子邮件和密码登录。成功后,将随机生成的令牌返回给用户,并存储在数据库的表中。此令牌是您可以存储在 sharedpref 中的内容,该令牌将与每个请求一起发送。为了使事情更有趣,您可以允许令牌在 10 分钟后过期(如果尚未使用(。在您的应用中,这意味着用户需要再次登录,并生成新的令牌。

如果要使用令牌生成模型,则需要确保令牌不容易猜到。我通常只对那些随机的字母数字字符串使用这样的东西:

$randomLongString = hash('sha384', microtime() . uniqid() . bin2hex(random_bytes(10)));

对于到期,您可以记录访问令牌表的时间戳,将其存储在具有相同令牌的列中。如果旧时间戳 +(到期时间(现在>时间戳,则您知道令牌已过期。返回 401。如果没有使用当前时间戳更新旧时间戳,则返回 200。

这些是相对简单但有效的解决方案,适用于单服务器设置,并且依赖于用户仍然是同一用户的事实。您可以执行的其他操作是在生成令牌之前进行 IP 检查、设备 ID 验证。如果这些事情中的任何一个在此过程中发生变化,您可以快速使令牌无效,并为用户提供一种方法来证明他们是他们声称的身份。

在我看来,带有client_credentialsGrantType的OAuth2是最好的选择。 对于令牌,我会使用 JWT(这是大多数 PHP 实现中的默认值(,它使您能够验证它是无状态的,并使您的身份验证环境更具可扩展性。

你将使用一组固定的客户端凭据(client_id和可选client_secret(授权应用,以使用用户的用户名和密码对身份验证服务器进行授权。然后,收到的令牌将存储在共享首选项中以供进一步授权。

最新更新