我想让用户可以在我的应用中使用外部oauth2提供商(facebook)登录。客户端部分在本机应用程序中的移动设备上运行 我不确定下面哪种方法我更喜欢? A)客户是否应该通过Facebook发送用户的访问令牌每个请求?在每个请求后端要求facebook验证访问令牌。根据验证结果,后端执行授权并将相应的结果返回给客户端 或者B)如果后端要求facebook仅在用户登录时验证访问令牌 ,则发出自己的访问令牌,将访问令牌返回给客户端,客户端将在发出请求时使用此访问令牌到服务器,以避免在每个请求时同意facebook?
我已经阅读了一些关于如何使用facebook实现auth的问题,并且大多数开发人员正在使用B,但我还没有看到任何解释为什么使用A的好/坏?
我认为解决方案的好处:
A)后端并不需要关心发布,刷新,验证访问令牌,因为这只能由facebook的授权服务器完成。
B)这个解决方案似乎更有效,因为它不需要在每次请求时连接到facebook。
答案 0 :(得分:2)
Facebook发布的安全令牌使用digital signature签名。 API服务器只需要访问公钥即可验证签名。在用户进行身份验证后,根本不需要联系Facebook。
用户使用Facebook登录后发出自己的令牌的原因可能是向令牌添加声明。但显然拥有自己的授权服务器需要付出代价。由你来衡量利弊。
如果您决定拥有自己的授权服务器,请确保不要自己编写代理服务器!有一些开源选项,如Thinktecture IdentityServer。
答案 1 :(得分:1)
我将投票选项B,这是我的解释,
您的API必须每次都使用一些身份验证令牌授权请求,该令牌不能是外部提供者令牌,在这种情况下,任何拥有其他提供者的访问令牌(例如:其他开发者)的人都可以访问您的API,基本上在这里没有认证。
当您的服务器发出访问令牌时,它很容易验证,并且在需要时可以轻松撤销(例如:在密码重置时)
在进行身份验证时,您的服务器可以完全控制发出访问令牌,因此只需进行一次验证,而不必每次都在调用API时进行验证。