REST api 项目的用户身份验证方法

User authentication methods for REST api project

我的网络服务器有一个 REST API。我需要在我的应用程序中添加用户身份验证,我的思考过程是这样的:

  1. 从应用表单获取用户的用户名和密码
  2. 加密密码,Base64编码用户名和密码
  3. 通过 HTTPS
  4. 将数据发送到 REST API
  5. Web 服务器验证凭据,returns 错误或成功

这安全吗?我看到很多人提到 OAuth2。它是什么?它比我的流程有什么优势?

OAuth2 的一个非常基本的解释是,用户将登录到您的系统,在发送之前加密用户名和密码,然后如果它通过身份验证,它将向用户发回一个令牌。

此后,每当用户尝试联系网络服务器时,它都会在每次 API 调用时发送此令牌。这就是它如何确保未经身份验证的人无法访问您的网络服务器。

所以基本上您当前的方法包括部分 OAuth2 标准,但不是最重要的部分(令牌)。

在您的情况下,您将如何阻止未经身份验证的人访问您的网络服务器?如果项目很小,那么这个风险就没有那么大。但是对于大公司来说,这是一个真正需要应对的威胁。

您使用单词 "encrypt" 而不是 "hash" 作为用户密码这一事实表明您对此知之甚少。这几乎肯定会导致您在某个地方弄乱您的身份验证程序,并使您的用户私人信息面临风险。

关于 OAuth2 的一个非常重要的一点是它可以与许多现有的第三方提供商(Google、Facebook、Twitter 等)一起使用,而您只需付出最小的努力。

您无需执行任何操作来存储凭据甚至验证用户身份。第三方负责所有这一切,只需向客户端提供一个令牌(长随机字符串),然后将其传递到您的服务器。然后您的服务器与第三方服务器对话以确保令牌有效(并获取您需要的任何信息,例如用户名、电子邮件地址或其他信息)。

如果可以的话,你真的应该考虑使用它。大公司投入了大量精力来保护他们的身份验证方法,您可以通过使用它来获得所有这些。

最后一点是用户不需要为(还)另一个帐户创建和记住凭据。

Google 有一些文档 get you started and includes an OAuth playground 来测试它在实践中是如何工作的。

在为您的用户提供身份验证门户之前,您真的应该尝试了解加密和哈希之间的区别。您可以使用许多不同的哈希算法。我过去曾亲自使用过 BCrypt,并且我也有相关的 SO Question。如今,您可以在几乎所有主要高级语言中找到几乎所有流行算法的实现。

显然,如果您不想做所有这些,您可以使用 OAuth 提供商,他会为您处理所有困难,例如安全地存储密码、保护数据库和所有其他安全方面。有许多可靠的 OAuth 提供商,Google、Facebook、Yahoo 等

要记住的一件事是托管您的应用程序的环境。每次用户想要访问您的应用程序时,OAuth 确实依赖于 OAuth 提供商服务器的可用连接。因此,如果您位于公司防火墙或类似网站的后面,可能会阻止访问 Facebook 等网站,这可能是个大问题。

我个人更喜欢对我的 API 项目进行基于令牌的身份验证。如果您不熟悉基于令牌的身份验证,可以阅读此 SO Question and this link.

The general concept behind a token-based authentication system is simple. Allow users to enter their username and password in order to obtain a token which allows them to fetch a specific resource - without using their username and password. Once their token has been obtained, the user can offer the token - which offers access to a specific resource for a time period - to the remote site.