首页 > 解决方案 > Facebook oauth2 - 登录后安全使用

问题描述

我想从理论上问一点。

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

  1. 管理数据:就像客户端角色一样,允许客户端访问应用程序的不同部分
  2. 客户数据:个人设置、活动历史等。

因为我想让登录尽可能用户友好,所以我想实现 facebook 登录。

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

当有人向 BE 发送请求时,我需要确定是登录到 facebook 的同一个人。

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

谢谢你的回答

菲利普·希尔克

标签: facebookoauth-2.0

解决方案


您应该研究OpenID Connect和 OAuth 协议的用法。它允许您向客户端应用程序(Angular6 + Spring 应用程序)验证用户身份,以验证用户详细信息。

当您发送access token访问某个资源时,应避免将其作为请求参数发送。通常鼓励在请求的 Authorization 标头下将其作为bearer token. 但是,如果您希望它更加安全,您可以在发送之前对令牌进行编码,这样就很难对其进行解码并窃取任何有价值的信息。

此外,当您发送敏感信息时,最好以JSON Web Token (JWT). 您可以使用第三方库创建 jwt 以包含需要发送到服务器的信息。您可以使用自己的签名对 jwt 进行签名,稍后可以进行验证。有关 jwts 的详细信息,请参阅https://www.rfc-editor.org/rfc/rfc7519

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

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


推荐阅读