我正在开发几个网络服务和一些客户端(网络应用程序,手机等) ,它们将通过 HTTP 与上述服务接口。我当前的工作项是为产品设计身份验证和授权解决方案。我已经决定利用外部身份提供商,如 Facebook、谷歌、微软、 Twitter 等进行身份验证。
I'm trying to solve the problem of, "when a request comes to my server, how do I know who the user is and how can I be sure?". More questions below as well...
系统应该使用基于令牌的身份验证(例如,与 cookie 或基本身份验证相反)。
我相信这是在提供松散耦合的同时跨多个客户机和服务器扩展的正确选择。
基于对基于令牌的身份验证的理解和阅读,下面是我对工作流的设想。现在让我们把注意力集中在 网页浏览器中的 Facebook上。我的假设是,其他外部身份提供程序应该具有类似的功能,尽管我还没有确认。
注意,在写这篇文章的时候,我是根据 Facebook 登录版本2.2写的
我想,对于服务器的后续请求,将重复步骤5-9(当用户的访问令牌有效时——没有过期、从 FB 端撤消、应用程序权限更改等等)
这里有一个示意图,可以帮助您完成这些步骤。请理解本系统是 没有单页应用程序(SPA)。所提到的 Web 服务是 API 端点,它们本质上是将 JSON 数据提供给客户端; 它们不提供 HTML/JS/CSS (Web 客户端服务器除外)。
首先,根据我的前言和要求,描述的方法是否有明显的缺口/陷阱?
是否需要/推荐向 Facebook 提出出站请求以验证访问令牌(步骤6-8) 每个客户的要求?
我至少知道,我必须验证来自客户端请求的访问令牌。然而,我不知道在第一次之后用于后续验证的推荐方法。如果有典型的模式,我有兴趣听听他们。我知道它们可能是应用程序依赖于我的需求; 但是,我还不知道要查找什么。一旦我有了基本的想法,我就会进行尽职调查。
例如,可能的想法:
在第一次验证完成后散列访问令牌 + userId 对,并将其存储在一个分布式缓存中(所有 Web 服务器都可以访问) ,期限等于访问令牌。在来自客户机的后续请求中,散列访问令牌 + userId 对并检查它在缓存中的存在。如果存在,则授权请求。否则,请联系 Facebook 图形 API 来确认访问令牌。我假设如果我使用 HTTPS (我将会使用 HTTPS) ,这种策略可能是可行的。然而,性能比较如何?
这个 StackOverflow 问题中接受的答案建议在 Facebook 用户令牌的第一次验证完成后创建一个自定义访问令牌。然后,自定义令牌将被发送到客户端以便进行后续请求。然而,我想知道这是否比上面的解决方案更复杂。这将需要实现我自己的标识提供程序(这是我想避免的,因为我首先想使用外部标识提供程序...)。这个建议有什么价值吗?
在上面步骤 # 3(提到的 给你)中的响应中是否存在 signedRequest 字段,它是否等同于“ Games 画布登录”流中的已签名请求参数 给你?
由于前者与后者在文档中有联系,因此它们似乎被暗示为等同的。然而,我很惊讶游戏页面中提到的验证策略在网络文档的“手动构建登录流程”呼叫中没有提到。
如果 # 3的答案是“ Yes”,那么解码签名并与预期在服务器端使用的内容进行比较的相同身份确认策略是否可行?
我想知道是否可以利用这一点,而不是对 debug _ token 图形 API (步骤 # 6)进行出站调用,以确认访问令牌是否符合建议的 给你:
当然,为了在服务器端进行比较,需要将已签名的请求部分与请求一起发送到服务器(步骤 # 5)。除了不牺牲安全性的可行性之外,我想知道与打出站呼叫相比,性能如何。
当我这样做的时候,在什么情况下/出于什么目的,例如,您会将用户的访问令牌持久化到数据库吗? 我不认为我需要这样做,但是,我可能忽略了一些事情。我很好奇,一些常见的场景会不会激发一些想法。
谢谢!