前言 我正在开发几个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 OAuth2身份validationstream程中同时使用“代码”和“令牌”,如下所述: https : //developers.facebook.com/docs/authentication/ ? 如果您查看OAuth对话框参考( https://developers.facebook.com/docs/reference/dialogs/oauth/ ),您似乎只使用令牌获取有关用户的信息,并且如果您指定response_type参数作为token或code,token ,那么你第一次得到令牌。 为什么你需要得到一个“代码”,然后使用代码来获得“令牌”,而不是直接获取令牌? 我想我误解了一些关于OAuth如何工作的基本知识,但是如果您第一次在对话框中获得令牌,则似乎完全避免了https://graph.facebook.com/oauth/access_token的请求。
我们有一个网站,在网站上login和validation自己的网站的唯一方法是与Facebook(这不是我的select)。 当您第一次使用Facebooklogin时,会自动为您创build一个帐户。 我们现在要为我们的网站创build一个iPhone应用程序,并且为他人使用我们的服务提供一个公共API。 这个问题是关于如何从应用程序/ APIauthentication我们的网站,并分成两部分: 什么是正确的方式来处理RESTauthentication从API到只使用Facebook OAuth作为身份validation方法的网站? 我已经阅读并研究了很多关于REST API的标准authentication方法。 我们不能使用基于HTTPS的基本身份validation之类的方法,因为没有这样的用户证书。 像这样的东西似乎只是用于validation使用API的应用程序。 目前,我能想到的最好方法是在API上点击/授权端点,redirect到Facebook OAuth,然后redirect回站点,并提供API的用户可以使用的“令牌”来validation后续要求。 对于我们创build的官方应用程序,我们不一定需要以相同的方式使用公共API。 那么与我们的网站交谈并authentication用户的最佳方式是什么? 我理解(我认为)如何使用API(公共)密钥和秘密(私人)密钥来authentication使用我们的API的第三方应用程序。 但是,当涉及到authentication使用该应用程序的用户时,我们对如何解决这个问题感到困惑,因为我们必须对Facebook进行身份validation。 我觉得我错过了一些非常明显的东西,或者不完全了解公共REST API应该如何工作,所以任何build议和帮助将不胜感激。
更新 这是2013年12月16日通过https://www.facebook.com/whitehat/report/报告给Facebook的,Facebook在12月17日回复说这个bug早已修复 。 我用我的Facebook帐户(我还没有validation电子邮件地址)对此进行了重新testing,在使用Grap API Explorer工具时 ,无法使用Graph API或使用FQL查询获取此帐户的电子邮件地址。 结论:您使用Graph API或FQL查询从Facebook获得的电子邮件地址是经过validation的电子邮件地址。 如果一个帐户还没有validation它的电子邮件,但不可能得到它。 原始post 我正在制作一个网站应用程序,提供用户使用Google或Facebooklogin的SSO。 我希望拥有这两种帐户的用户在系统中显示为相同的用户,而不pipe他们使用何种身份login。 为了达到这个目的,我正在考虑使用电子邮件地址作为标识符,以便知道我是否应该创build一个新帐户或用户是否已经存在。 为了不引入任何安全问题,我必须知道电子邮件地址已被validation,并且实际上属于用户。 对于Google来说, userinfo API可以告诉我一个电子邮件是否被validation,所以这里没有问题。 但是我在Facebook Graph API中找不到这样的东西。 是否有可能知道在Facebook上确认电子邮件地址? 我知道有一个verified字段,但是只会告知帐户是否已validation,而不是电子邮件地址。 起初,它看起来像只能使用graphicsAPI的电子邮件地址已被确认的帐户。 如果地址没有被确认,我只是得到一个错误告诉我,我必须先确认电子邮件地址,才能login到任何第三方网站。 但是,这似乎并不是所有的帐户。 在某些情况下,即使您没有确认的电子邮件地址,也可以访问Facebook的所有部分。 其中一个例子就是当您使用@ myopera.com邮箱地址注册时。 当您使用@ myopera.com电子邮件地址注册Facebook时,只要您提交registry单,您的帐户就会被暂时locking。 为了继续,您需要提供您的电话号码来validation您的帐户,并“保持Facebook安全,免遭垃圾邮件”(对于截图中的瑞典语抱歉,这是在我可以进入Facebook并将语言更改为英语之前): 当你提供你的电话号码时,你已经login了,Facebook不再唠叨任何关于你必须validation你的电子邮件地址的信息。 您只能看到您的电子邮件地址尚未validation的地方位于设置页面上: 在validation您的电子邮件地址之前,通常无法访问的移动设置可用,并列出注册时input的电话号码: 除此之外,还可以使用未经确认的电子邮件地址login第三方网站: 当我连接到这个用户的graphicsAPI,我可以得到未经确认的电子邮件地址和已verified字段返回真如预期,因为我已经通过添加一个电话号码validation帐户 。 所以显然我不能相信我从Facebook获得的电子邮件地址确实属于拥有Facebook账户的用户。 有没有其他的方式知道电子邮件地址是否被validation,或者我是否必须自己validation,如果我想用它来识别用户?