facebook - Facebook oauth2 - 登录后安全使用
问题描述
我想从理论上问一点。
我有一个 angular6 + spring 应用程序,它有自己的客户端、特定于应用程序的客户端数据。这些数据可以分为两组
- 管理数据:就像客户端角色一样,允许客户端访问应用程序的不同部分
- 客户数据:个人设置、活动历史等。
因为我想让登录尽可能用户友好,所以我想实现 facebook 登录。
用户单击“FB 登录按钮”后,facebook 会返回一些用户信息,主要是一个安全令牌。我如何使用它与我的 BE 进行安全通信。
当有人向 BE 发送请求时,我需要确定是登录到 facebook 的同一个人。
- 如果我将此令牌作为请求的一部分发送,什么会阻止可能的攻击者以某种方式获取令牌然后冒充原始用户?
- 我应该以什么形式将我从 Facebook 获得的数据发送到我自己的服务器?
- 我应该如何在服务器上使用令牌?
- 如何验证其真实性?
谢谢你的回答
菲利普·希尔克
解决方案
您应该研究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供您大致了解。
推荐阅读
- reactjs - 在 SAML 身份验证后发布以响应应用程序时出错
- sql - Postgres 文本搜索与 GIN 索引并在其他列上排序 DESC
- python - 转换 numpy.ndarry.tolist 时丢失数据类型?
- here-api - Here.com API 正确结构
- azure - 在处理 Azure CosmosDb ChangeFeed 时跟踪列更改
- python - 无法从 .kv 文件调用函数,解释器声称类和方法不存在
- html - Angular TypeError:使用 event.target.file [0] 时无法读取未定义的属性“0”
- nginx - 带有 keycloak 的 jhipster 应用程序
- git - GIT:将更改从一个分支移动到另一个分支
- node.js - 在 fsevents 的 npm 安装期间 nody-gyp 重建的目的是什么?