使用外部 oauth2 提供程序 (facebook) 时,我的应用程序是否应该发布它自己的访问令牌?

Should my app issue it's own access tokens, when using external oauth2 provider (facebook)?

我想让用户可以在我的应用程序中使用一些外部 oauth2 提供商 (facebook) 登录。客户端的部分是 运行 在移动设备上的本机应用程序。

我不确定我应该选择以下哪种方法?

  1. 客户端是否应该通过 facebook 发送用户的访问令牌 each 请求?在每个请求后端要求 facebook 验证访问令牌。后台根据验证结果进行授权,并return对应结果给客户端。

  2. 如果后端要求 facebook 仅在用户登录时验证访问令牌,然后发布自己的访问令牌,return访问令牌回到客户端,客户端将在向服务器发出请求时使用此访问令牌,以避免在每次请求时联系 facebook ?

我已经阅读了一些关于如何使用 facebook 实现身份验证的问题,并且大多数开发人员都在使用 B,但是我没有看到任何解释为什么 good/bad 使用 A?

我认为解决方案的好处:

  1. 后端不需要关心发布、刷新、验证访问令牌,因为这仅由 facebook 的授权服务器完成。
  2. 这个解决方案似乎更有效,因为它不需要在每次请求时都连接到 facebook。

Facebook 发行的安全令牌使用 digital signature 签名。 API 服务器只需要访问 public 密钥来验证签名。用户通过身份验证后,根本不需要联系 Facebook。

在用户使用 Facebook 登录后发行您自己的令牌的一个原因可能是向令牌添加声明。但显然拥有自己的授权服务器是有代价的。利弊由你权衡。

如果您决定拥有自己的授权服务器,请确保不要自己编写!有开源选项,例如 Thinktecture IdentityServer.

我会投票给选项 B,这是我的解释,

  1. 您的 API 每次都必须使用一些身份验证令牌授权请求,该身份验证令牌不能是外部提供商令牌,在这种情况下,任何拥有其他访问令牌(例如:其他开发人员)的人提供者可以访问你的api,基本上这里没有授权。

  2. 当您的服务器发出访问令牌时,它很容易验证,并且在需要时可以很容易地撤销(例如:在密码重置时)

  3. 在进行身份验证时,您的服务器可以完全控制颁发访问令牌,因此只需进行一次验证,而不必每次调用 API.