仅使用社交提供者登录认证时,客户端和服务器之间的认证策略应该是什么?

What should be authentication strategy between client and server when only social providers login authentication is used?

给定以下条件:

  1. 网站仅使用社交提供商来验证用户 (Google/Facebook)。没有本机身份验证。
  2. 只有部分部分(例如产品评论)受到限制。
  3. 网站与服务器通信(同域)。

最好的身份验证策略是什么?


- 仅使用社交提供商

在这种情况下:

  1. 我们需要研究每个提供商的 refresh/revoke 令牌机制并加以实施。

- 使用社交提供商来验证用户的真实性,但使用原生令牌

在这种情况下:

  1. 我们使用社交提供商验证用户是否真实。
  2. 我们生成自己的令牌并将其发送给客户端。

在我看来,第二种方法要好得多,因为:

  1. 无需研究如何根据每个社交提供商获取刷新令牌。
  2. 我们的服务器完全受控:过期时间控制。
  3. 撤销令牌也更容易(例如更改我们自己服务器中的秘密)。
  4. 错误处理更容易,因为在从社交提供者刷新令牌时不需要处理错误情况,而是可以实现我们自己的错误处理。
  5. 如果用户关闭 window 社交提供商刷新令牌将在几个小时后过期,而我们的令牌不会。
  6. 如果使用社交提供商令牌,那么它们将在每次请求时从客户端发送到服务器,这比我们自己的令牌具有更高的安全风险(google/facebook 中的用户敏感数据比我们网站中的多得多).此外,它们必须保存在客户端的某个位置以保持持久性,这同样会带来更高的安全风险。
  7. 社交提供商令牌不包含任何特定于我们服务器的用户信息。这意味着更频繁地查询我们的数据库以识别用户,而不是仅仅将我们的用户 ID 放入令牌(也许是 JWT 令牌)中。

对我来说最大的缺点是我们必须为每个社交提供者维护多个 refresh/revoke 机制,而不是一个(我们自己的)。

在这种情况下最好的做法是什么会很有趣。

联合登录感觉是最好的选择,它应该可以满足您上面描述的目标:

  • 在登录期间,应用会重定向到您的授权服务器 (AS)
  • A​​S 重定向到社交身份提供商 - 例如 Facebook
  • 用户使用 Facebook 凭据登录
  • 社交提供商向 AS 发布令牌
  • A​​S 生成自己的令牌 return 到应用程序
  • 您的应用通过令牌中的 AS 用户 ID 识别用户
  • 直到下次登录才使用社交提供程序

例如,这里有一个 link 到 AWS Solution,其中每个应用程序都可以 select 它支持的社交提供商,并且可以禁用默认的 Cognito 登录选项如果需要的话。