使用Facebook登录并使用OAuth 2.0进行REST API调用的身份验证

5
我正在使用Spring框架和REST架构来创建API。目前,我通过在每个调用中发送用户名和密码来验证REST调用。用户存储在我的数据库中。
现在,我计划使用OAuth 2.0来访问我的受保护资源,并且我计划使用Facebook登录作为身份验证机制。
我已经了解了spring-security-oauth2并在一个小例子中实现了它,它能正常工作。
我已经了解了spring-social,并且也已经实现了它,可以访问Facebook API。
现在,我想知道如何使用Facebook登录,然后使用OAuth 2.0来保护我的资源。
非常感谢您的帮助。

你有什么困难? - smk
使用Facebook API会给我提供Facebook访问令牌,而使用OAuth 2.0进行身份验证需要由OAuth 2.0生成的令牌。现在我很困惑,如何使用Facebook访问令牌来验证对我的API受保护资源的请求。 - khobab
1个回答

3
您不应该使用Facebook颁发的访问令牌来保护您自己的资源。Facebook令牌代表您的应用程序、Facebook和您的用户之间的三方协议。如果您想使用OAuth来保护自己的资源,那么这就是消费者、您的服务器和拥有您服务器上这些资源的用户之间完全不同的协议。
可以这样想:当您使用Facebook的API时,您的应用程序(A)是消费者,Facebook(FB)是提供者,还有一个共同的用户(U1)将它们连接在一起。但是当某个人在您的服务器上使用资源时,那么您的应用程序(A)扮演的是提供者的角色,另一个应用程序(X)则是消费者,并且有一个共同的用户(U2)将它们连接在一起。可能是同一个人(例如U1 == U2)在两种情况下都同意了这个安排,但是提供者和消费者的角色已经改变了。
我想,可能有一种方法可以让Spring Security for OAuth发出与Facebook颁发的相同访问令牌,但这并不是一个好主意。

我想通过Facebook登录来登录我的OAuth受保护的API,那么我该如何实现呢? - khobab
2
通常情况下,用户会通过Facebook认证您的应用程序的人类可见的HTML前端。这将导致Facebook发出访问令牌,您可以使用该令牌对用户进行身份验证。Spring Social的ProviderSignInController或SocialAuthenticationFilter可以帮助实现此功能。一旦在您的应用程序中进行了身份验证,他们将授权API的某些客户端代表他们访问API。这将导致S2OAuth向客户端发出访问令牌。 - Craig Walls
1
这种方法的一个常见示例(不一定使用Spring Social或S2OAuth)是Foursquare。您可以通过Facebook登录Foursquare。您还可以授权其他客户端代表您访问Foursquare。但这些是两个不同的授权和两个不同的协议。这种方法的另一个示例是使用Spring的Greenhouse(https://github.com/SpringSource/greenhouse)。 - Craig Walls
我和楼主处于同样的位置,基本上有着相同的需求。我认为我的困难在于理解oauth舞蹈中的各个参与者及其角色。据我所见,我有一个REST API,并且将有一个客户端(尚未编写,但可能是带有angularjs的Web客户端)。我希望用户能够通过Facebook进行身份验证。如果他们通过Facebook进行了身份验证,则有权使用REST API。基于此,我不明白为什么不想使用Facebook发行的令牌? - Nathan Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接