使用 PHP 构建 RESTful 身份验证

时间:2021-07-24 06:54:28

标签: php api-authorization

我正在用纯 PHP 为我自己的初学者项目构建 REST API。 API 将具有 CRUD 功能,其中“R”可供所有用户(包括未经身份验证的用户)使用,而“CUD”功能仅适用于经过身份验证的用户。这只是我的项目,所以安全性并不是很重要,但我想了解它的实际考虑和实施方式。我目前的理解和实现如下。

  • 首先,我使用用户名和密码为登录 API POST 请求创建了一个登录路由,然后点击数据库进行检查。
  • 然后通过散列用户名和存储在服务器环境变量中的 SECRET_SALT 生成令牌。
  • 此令牌 + 用户名然后通过 setcookie() 发送到客户端,使用 httponly cookie 以防止 JS 访问。
  • 令牌将与来自客户端的针对我指定 API 路径的每个请求一起在标头中发送。
  • 在对每个受保护路径进行 API 调用之前,我将 require() 一个脚本来检查发送的令牌 + 用户名,使用环境变量中的 SECRET_SALT 散列(发送的)用户名,并检查它们是否等于发送的(令牌) ).
  • 如果它们是正确的,我将允许脚本继续。
  • 如果不是,脚本将终止并未经身份验证发送。

我真正想知道的是 -

  1. 我读到很多人都说在这样的 REST API 中使用会话会减损安宁性,因为服务器上存储了一些状态(在会话中,我想这将在数据库中)。这就是我必须以这种方式实现它的原因,因为我也不想每次向受保护的路由发出请求时都访问数据库。但是我的实现还包括服务器上永远不会改变的 SECRET_SALT。所以我想知道它是否偏离了安息?毕竟,客户端会随请求一起发送所有必需的信息,并且服务器上并未存储特定客户端的特定状态。

  2. 有没有办法以纯 PHP 方式实现中间件,在一组特定的路由之前调用它,因为我有点重复自己在每个受保护的路由前执行 require() 。我在我的项目中创建了一个名为 /api 的文件夹,并将所有端点文件放在那里。例如localhost/api/read.php(PS。我可以看到所有的库都在做这个,我想用纯PHP实现)

  3. 我知道这不是安全的做事方式,因为即使使用 httponly,令牌也可以在非 HTTPS 连接中被嗅探,并且除非用户名更改,否则它们永远不会为特定用户更改。我可以看到许多用于进行身份验证的库,但我不想将任何库用于 JWT 和 OAuth 之类的东西,那么是否还有其他不那么笨拙且更安全的仅限 PHP 的方法可以通过遵循 REST 协议来执行,或者我应该坚持存储会话并访问数据库?

提前感谢您的回答。

0 个答案:

没有答案