2016-11-11 49 views
0

我有一个基于Web的API,我正在构建Spring Boot中构建的API并使用OAuth2。该API适用于移动应用程序。将快速注册集成到使用Spring Boot的现有API中使用OAuth2

作为移动应用程序登录的一部分,登录选项之一是使用您的Twitter/Facebook帐户。

我最初的想法是让APP通过Facebook/Twitter认证用户,然后将令牌传递给API。然后,API将使用Facebook/Twitter验证令牌,收集FB/Twitter ID并使用该ID创建新帐户。但是,这种方法的问题是,我不确定如何使用现有的OAuth库创建持票人令牌,因为OAuth库在标准登录(用户名/密码)期间处理所有这些。

另一种选择是让APP通过Facebook/Twitter对用户进行身份验证,然后使用用户FB/Twitter ID作为用户名,通过API将用户注册为正常用户,但这种“感觉”方式不太安全,但整合更容易。

当时,认证令牌由OAuth库存储在MySQL数据库表'oauth_access_token'中。我想我可以手动创建JWT并自己更新此表。

我接受任何有用的建议。

回答

0

这可能是一个更简单的解决方案,我最初在我的问题中提出的解决方案。

1)移动应用使用Facebook/Twitter验证用户身份,并接收回令牌。

2)移动应用程序向我的API [/用户/快速登录]发送请求,传递终端用户Facebook或Twitter令牌。

3)API使用Facebook/Twitter令牌从Facebook/Twitter获取用户详细信息。一旦拥有用户社交媒体ID,我们就可以使用该ID在数据库中搜索用户。如果不存在,请使用Facebook/Twitter返回的信息创建用户。对于用户密码,我们将使用只有服务器知道的密钥来加密用户的Facebook/Twitter ID。密码在被存储在数据库中之前再次被加密,因为我们的所有密码都是。这确保了用户密码不仅仅是他们的Facebook/Twitter ID,因为那样会太不安全。

4)我们的API使用电子邮件地址作为他们的用户名,因为我们现在知道用户的电子邮件地址,并且我们知道密码是Facebook/Twitter ID的加密版本,所以我们可以向我们自己的OAuth服务器[/ oauth/token]传递用户名/密码,然后我们简单地将该响应返回给移动应用程序。

对我来说,这似乎是最合乎逻辑的做法,尤其是因为OAuth服务器总有可能在它自己的硬件实例上运行,并且'可能'无法直接从我们的API访问它的类。

+0

**不要加密密码**,当攻击者获取数据库时,他也会得到加密密钥。使用随机盐在HMAC上迭代大约100毫秒的持续时间,并用散列表保存盐。使用诸如password_hash,PBKDF2,Bcrypt和类似函数的函数。关键是要让攻击者花费大量时间通过强力查找密码。 – zaph

+0

对不起,我应该提到。密码使用BCrypt存储在数据库中,该密码与盐一起存储密码。我将使用的唯一加密方法是为社交媒体帐户生成密码。如果用户的Twitter ID是123456,我将使用加密密钥创建一个密码,然后将结果存储到数据库中,首先将它传递给BCrypt。显然,如果有人想掌握项目源代码,他们将能够确定我们如何创建社交密码,但我想不出另一种方式来做到这一点。 – SheppardDigital

+0

攻击者将获得管理员访问您的服务器的权限,这就是攻击的工作原理。攻击者是专业人员,他们每天都会去工作,并在攻击系统上工作,这是一项常规工作。他们技术娴熟,极有可能在安全和密码学方面拥有比您更好的技能,并拥有出色的攻击工具。显然你在某种程度上理解了这一点,或者你不会在服务器上使用任何加密技术。如果您有一个加密密钥存储在服务器上的文件中,它将被找到并使用。你可能永远不会知道有攻击。 – zaph

相关问题