Facebook oauth2-安全的登录后使用

时间:2018-12-06 01:21:12

标签: facebook oauth-2.0

从理论上我想问一下。

我有一个angular6 + spring应用程序,该应用程序具有自己的客户端,特定于应用程序的客户端数据。 这些数据可以分为两组

  1. 管理数据:类似于允许客户端访问应用程序不同部分的客户端角色
  2. 客户数据:个人设置,活动历史记录等

因为我想使登录尽可能地方便用户,所以我想实现facebook登录。

用户单击“ FB登录按钮”后,facebook返回一些用户信息,主要是安全令牌。我该如何使用它与我的BE安全通信。

当有人向BE发送请求时,我需要确保与登录Facebook的人相同。

  1. 如果我将此令牌作为请求的一部分发送,那么什么阻止了可能的攻击者以某种方式获取令牌然后冒充原始用户?
  2. 我应该以哪种形式将从Facebook获得的数据发送到自己的服务器上?
  3. 我应该如何在服务器上使用令牌?
  4. 如何验证其真实性?

谢谢您的回答

FilipŠirc

1 个答案:

答案 0 :(得分:0)

您应该研究OpenID Connect以及OAuth协议的用法。它使您可以通过客户端应用程序(Angular6 + Spring应用程序)对用户进行身份验证,以验证用户详细信息。

在发送access token以访问某些资源时,应避免将其作为请求参数发送。通常,建议将其作为bearer token发送到请求的“授权”标头下。但是,如果您希望它具有更高的安全性,则可以在发送之前对令牌进行编码,以使其难以解码并窃取任何有价值的信息。

另外,当您发送敏感信息时,最好以JSON Web Token (JWT)的形式发送它们。您可以使用第三方库来创建jwt,以包含需要发送到服务器的信息。您可以使用自己的签名对jwt进行签名,稍后可以对其进行验证。请参阅https://tools.ietf.org/html/rfc7519了解有关jwts的详细信息。

您应该使用access token中的声明来授予用户访问您所保护的资源的权限。由于大多数令牌都是以jwts形式发送的,因此您可以对其进行解码并检查必要的声明,例如范围,受众(客户端应用),主题(用户)等。

最重要的是,您应该验证从Facebook发送的令牌的签名,以确保它是真实的。为此,您必须从Facebook的public key获取jwks endpoint的详细信息,并使用第三方库(auth0,nimbusds等)来验证签名。 Facebook的数字签名将是唯一的,并且此验证过程是确保安全性的最佳方法。另外,您可以检查令牌中的某些声明是否与您的期望值匹配以验证令牌。这也可以通过上面提到的库来完成。这是auth0 repo,供您了解一般想法。