前言 我正在开发几个Web服务和一些客户端(Web应用程序,手机等),这些客户端将通过HTTP与所述服务进行接口。 我目前的工作是为产品devise一个authentication和授权解决scheme。 我已决定利用Facebook,Google,Microsoft,Twitter等外部身份提供商进行身份validation。 我试图解决这个问题,“当请求到达我的服务器时,我怎么知道用户是谁,我怎么能确定?”。 下面还有更多的问题 要求 依靠外部身份来表明我正在处理的是谁(“userId”本质上就是我所关心的)。 系统应该使用基于令牌的authentication(而不是cookie,例如基本authentication)。 我相信这是跨多个客户端和服务器进行扩展,同时提供松散耦合的正确select。 工作stream程 基于我对基于令牌的身份validation的阅读和理解,以下是我如何想象工作stream程。 现在让我们在网页浏览器上关注Facebook 。 我的假设是,其他外部身份提供者应该有类似的能力,虽然我还没有确认。 请注意,截至撰写时,我将基于Facebooklogin版本2.2以下 客户端:使用JavaScript SDK启动Facebook的login Facebook:用户authentication和批准应用程序权限(例如访问用户的公开个人资料) Facebook:向包含用户的访问令牌,ID和签名请求的客户端发送响应 客户端:在浏览器会话中存储用户访问令牌( 方便地由SDK处理 ) 客户端:通过在授权标头中发送用户的访问令牌+用户的标识(潜在地在自定义标头中)向我的Web服务请求安全资源, 服务器:从请求头读取用户访问令牌,并通过向Facebook提供的debug_tokengraphicsAPI发送请求来启动validation Facebook:使用用户访问令牌信息(包含appId和userId)回应服务器 服务器:通过比较appId与预期(本身已知)和userId与客户端请求上发送的内容的比较来完成令牌的validation 服务器:用请求的资源响应客户端(假定愉快的授权path) 我想象的步骤5-9将重复随后的请求到服务器(而用户的访问令牌是有效的 – 没有过期,从FB侧撤销,应用程序权限改变等) 以下是帮助您完成步骤的图表。 请理解这个系统不是一个单一的页面应用程序(SPA)。 提到的Web服务是API端点,将JSON数据本质上提供给客户端; 他们不提供HTML / JS / CSS(除了Web客户端服务器)。 问题 首先,根据我的序言和要求,有没有明显的差距/陷阱? 正在执行一个出站请求到Facebookvalidation访问令牌(上面的步骤6-8) 每客户端请求 /推荐? 我至less知道,我必须validation来自客户端请求的访问令牌。 但是,第一个后续validation的推荐方法对我来说是未知的。 如果有典型的模式,我有兴趣听到它们。 根据我的要求,我明白他们可能是依赖于应用程序; 然而,我只是不知道该找什么。 一旦我有一个基本的想法,我会尽职尽责。 例如,可能的想法: 首次validation完成后,将访问令牌+ userId对散列,并将其存储在分布式caching中(所有Web服务器均可访问),并且有效期等于访问令牌。 在随后来自客户端的请求中,对访问令牌+用户ID对进行散列并检查其在caching中的存在。 如果存在,则请求被授权。 […]
我知道有很多关于Facebook访问令牌和他们所造成的悲伤的问题,但是尽pipe有很多实验,并且阅读了许多令人沮丧的模糊的博客文章(FB和其他),但我仍然在努力得到一个明确的答案。 让我简单地分解我的过程到目前为止: 我正在创build一个站点,服务器端,需要从一个单独的Facebook页面拉的post/状态 我是该Facebook页面的pipe理员 我创build了一个Facebook应用程序 使用Facebook Graph API Explorer ,我生成了一个短期密钥,连接到我的应用程序和我的帐户,授予我的帐户权限以查看我的页面的访问令牌 我已经把我的短命钥匙转换成长寿命钥匙(60天) 这就是我被卡住的地方 我的60天密钥工作正常,我的服务器从页面中获取所需的信息,但据我所知,没有办法以编程方式扩展60天的密钥。 我也不知道如何生成新的短期密钥,而无需手动转到Facebook Graph API Explorer并创build一个。 由于这是我的服务器向Facebook API发出请求,而不是基于用户的系统(我可以轻松地请求用户再次授权Facebook应用程序),因此会创build一个非常笨拙的系统。 由于Facebook弃用offline_access ,是否真的没有永久的办法让我的服务器从我自己的网页拉动信息? 我真的需要手动创build一个新的密钥,并手动每隔60天更新一次服务器吗? 还是有什么我失踪? 更新: 以前在这里find的分步指南已经被转移到了自己的答案中 。
我在Facebook上有一个商业页面(在Facebook上称为粉丝页面)。 我想post to that Page只要用户在我的应用程序上采取一定的行动。 我想发布为页面本身而不是用户(即从我的个人帐户)。 该post将来自我的外部服务器(我正在使用restFB)。 我已经完成了授权我的个人帐户以及页面的相应manage_pages权限的步骤。 我也获得了页面的访问令牌。 我甚至能够按照我的意愿将其张贴到该页面。 问题是,我得到的令牌(通过他们的开发工具graphics浏览器)有一个小时到期。 我需要它持续比这更长的时间,最好永远。 我环顾了互联网,其中包括SO的答案和大多数post指向可怕的FB文档或作出模糊的引用挂钩我的外部应用程序到facebook应用程序,并通过发布。 我试图做这个工作,但我很困惑整个过程,坦率地说(什么是callback地址,例如?)。 无论如何,我很乐意看到简单的英语一步一步的指示, getting a long lasting access token ,我可以使用从一个应用程序发布到Facebook粉丝页面。 请不要参考FB文档。 这很糟糕。 我至less经历了十几次。 谢谢。
我在一个有Facebook页面作为其数据源之一的项目上工作。 它会定期从其中导入一些数据,而不涉及GUI。 然后我们使用一个Web应用程序来显示我们已有的数据。 并非所有的信息都是公开的。 这意味着我必须访问一次数据,然后保存它。 但是,我不知道这个过程,我还没有找到一个很好的教程。 我想我需要一个access_token ,我怎么能从用户,一步一步得到它? 用户是一个Facebook页面的管理员,他将不得不添加我们的一些FB应用程序的页面? 编辑:谢谢@phwd的提示。 我做了一个教程如何获得永久页面访问令牌,即使offline_access不再存在。 编辑:我只是发现它在这里回答: 持久的FB访问令牌服务器拉FB页面信息