前言
我正在开发几个 Web 服务和一些客户端(Web 应用程序、移动设备等),它们将通过 HTTP(s) 与所述服务进行交互。我目前的工作项目是为产品设计一个身份验证和授权解决方案。我决定利用外部身份提供商,例如 Facebook、Google、Microsoft、Twitter 等进行身份验证。
我正在尝试解决“当请求到达我的服务器时,我如何知道用户是谁以及我如何确定?”的问题。下面还有更多问题...
需求
我相信这是在提供松散耦合的同时跨多个客户端和服务器进行扩展的正确选择。
工作流程
根据我对基于 token 的身份验证的阅读和理解,以下是我想象的工作流程。现在让我们关注 网页浏览器中的 Facebook .我的假设是其他外部身份提供者应该具有类似的功能,尽管我还没有确认。
请注意,在撰写本文时,我将以下内容基于 Facebook 登录版本 2.2
我想象着对服务器的后续请求将重复步骤 5-9(当用户的访问 token 有效时 – 未过期、从 FB 端撤销、应用程序权限更改等)
这是一个图表,可帮助您完成这些步骤。请理解本系统是不是 单页应用程序 (SPA)。提到的 Web 服务本质上是将 JSON 数据提供给客户端的 API 端点;他们不提供 HTML/JS/CSS(Web 客户端服务器除外)。
问题
我至少知道,我必须验证来自客户端请求的访问 token 。但是,我不知道第一次之后的后续验证的推荐方法。如果有典型的模式,我有兴趣了解它们。我了解它们可能取决于我的要求;然而,我只是不知道该找什么。一旦我有了一个基本的想法,我就会进行尽职调查。
例如,可能的想法:
它们似乎被暗示为等价的,因为前者在文档中链接到后者。然而,我很惊讶游戏页面上提到的验证策略在“手动构建登录流程”中没有提到page的网络文档。
我想知道是否可以利用它而不是对 debug_token 图形 API(上面的第 6 步)进行出站调用来确认访问 token ,如推荐 here :
当然,为了在服务器端进行比较,签名的请求部分需要与请求一起发送到服务器(上面的第 5 步)。除了不牺牲安全性的可行性之外,我想知道与进行出站调用相比性能如何。
我没有看到需要这样做的场景,但是,我可能忽略了一些东西。我很好奇一些常见的场景可能会引发一些想法。
谢谢!
最佳答案
根据您的描述,我建议使用服务器端登录流程,如
这样 token 已经在您的服务器上,不需要从客户端传递。如果您使用非加密连接,这可能存在安全风险(例如,对于中间人攻击)。
步骤是:
(1) 登录人员
您需要指定要从
scope
中的用户那里收集的权限。范围。可以通过普通链接触发请求:GET https://www.facebook.com/dialog/oauth?
client_id={app-id}
&redirect_uri={redirect-uri}
&response_type=code
&scope={permission_list}
看
(2) 确认身份
GET https://graph.facebook.com/oauth/access_token?
client_id={app-id}
&redirect_uri={redirect-uri}
&client_secret={app-secret}
&code={code-parameter}
(3) 检查访问 token
您可以通过在您的问题中已经说过的方式检查 token
GET /debug_token?input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
这应该只在服务器端完成,否则你会让你的应用程序访问 token 对最终用户可见(不是一个好主意!)。
看
(4) 扩展访问 token
获得(短暂的) token 后,您可以调用以扩展 token ,如
像下面这样:
GET /oauth/access_token?grant_type=fb_exchange_token
&client_id={app-id}
&client_secret={app-secret}
&fb_exchange_token={short-lived-token}
(5) 访问 token 的存储
关于在服务器上存储 token ,FB 建议这样做:
(6) 处理过期的访问 token
由于 FB 不会通知您 token 是否已过期(并且如果您在拨打电话之前不保存到期日期并将其与当前时间戳进行比较),如果 token 无效,您可能会收到来自 FB 的错误消息(最多 60 天后)。错误代码将为
190
:{
"error": {
"message": "Error validating access token: Session has expired at unix
time SOME_TIME. The current unix time is SOME_TIME.",
"type": "OAuthException",
"code": 190
}
}
看
If the access token becomes invalid, the solution is to have the person log in again, at which point you will be able to make API calls on their behalf once more. The login flow your app uses for new people should determine which method you need to adopt.
关于facebook - 应如何在服务器端使用 Facebook 用户访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294165/