【发布时间】:2016-01-09 06:31:47
【问题描述】:
我的网络服务器有一个 REST API。我需要给我的应用添加用户认证,我的思路是这样的:
- 从应用表单中获取用户的用户名和密码
- 加密密码,Base64 对用户名和密码进行编码
- 通过 HTTPS 将数据发送到 REST API
- Web 服务器验证凭据,返回错误或成功
这安全吗?我看到很多提到 OAuth2。它是什么?它比我的流程做得更好?
【问题讨论】:
标签: android api rest oauth oauth-2.0
我的网络服务器有一个 REST API。我需要给我的应用添加用户认证,我的思路是这样的:
这安全吗?我看到很多提到 OAuth2。它是什么?它比我的流程做得更好?
【问题讨论】:
标签: android api rest oauth oauth-2.0
对 OAuth2 的一个非常基本的解释是,用户将登录到您的系统,并在发送用户名和密码之前对其进行加密,然后如果通过身份验证,它将向用户发送回一个令牌。
此后,每当用户尝试联系 Web 服务器时,它都会将此令牌与每个 API 调用一起发送。这就是它确保未经身份验证的人无法访问您的网络服务器的方式。
所以基本上你当前的方法包括 OAuth2 标准的一部分,但不是最重要的部分(令牌)。
在您的情况下,您将如何阻止未经身份验证的人访问您的网络服务器?如果项目很小,那么风险就不会那么大。但对于大公司来说,这是一个真正需要应对的威胁。
【讨论】:
您对用户密码使用“加密”一词而不是“哈希”这一事实表明您对此知之甚少。这几乎肯定会导致您在某个地方弄乱您的身份验证程序,并使您的用户私人信息面临风险。
关于 OAuth2 的一个非常重要的一点是,它可以与许多现有的第三方提供商(Google、Facebook、Twitter 等)一起使用,而您只需付出最小的努力。
您无需执行任何操作来存储凭据甚至验证用户身份。第三方负责所有这些,并简单地为客户端提供一个令牌(长随机字符串),然后将其传递给您的服务器。然后,您的服务器与第三方服务器通信以确保令牌有效(并获取您需要的任何信息,例如用户名、电子邮件地址或其他信息)。
如果可以的话,你真的应该考虑使用它。大公司为保护他们的身份验证方法付出了很多努力,而您可以通过使用它来获得所有这些。
最后一点是,用户不需要为(还)另一个帐户创建和记住凭据。
Google 为get you started 提供了一些文档,并包含一个OAuth playground 以测试其在实践中的工作方式。
【讨论】:
在为您的用户提供身份验证门户之前,您应该真正尝试了解加密和散列之间的区别。您可以使用许多不同的哈希算法。我过去曾亲自使用过 BCrypt,我也有一个相关的 SO Question 与它有关。如今,您可以在几乎所有主要的高级语言中找到几乎所有流行算法的实现。
显然,如果您不想做所有事情,您可以使用 OAuth 提供程序,该提供程序会为您处理所有难题,例如安全地存储密码、保护数据库以及所有其他安全方面。有很多可靠的 OAuth 提供商,Google、Facebook、Yahoo 等。
要记住的一点是托管应用的环境。每次用户想要访问您的应用程序时,OAuth 确实依赖于 OAuth 提供者的服务器可用的连接。因此,如果您位于可能阻止访问 Facebook 等网站的公司防火墙或类似设备的后面,这可能是个大问题。
我个人更喜欢对我的 API 项目进行基于令牌的身份验证。如果您不熟悉基于令牌的身份验证,可以阅读此 SO Question 和 this 链接。
a 背后的一般概念 基于令牌的身份验证系统是 简单的。允许用户输入他们的 用户名和密码,以便 获得一个令牌,使他们能够 获取特定资源 - 没有 使用他们的用户名和密码。 获得他们的令牌后, 用户可以提供令牌 - 其中 提供对特定资源的访问 一段时间 - 到远程 网站。
【讨论】: