使用Facebook进行身份validation的网站的REST API

我们有一个网站,在网站上login和validation自己的网站的唯一方法是与Facebook(这不是我的select)。 当您第一次使用Facebooklogin时,会自动为您创build一个帐户。

我们现在要为我们的网站创build一个iPhone应用程序,并且为他人使用我们的服务提供一个公共API。

这个问题是关于如何从应用程序/ APIauthentication我们的网站,并分成两部分:

  1. 什么是正确的方式来处理RESTauthentication从API到只使用Facebook OAuth作为身份validation方法的网站?

    我已经阅读并研究了很多关于REST API的标准authentication方法。 我们不能使用基于HTTPS的基本身份validation之类的方法,因为没有这样的用户证书。 像这样的东西似乎只是用于validation使用API​​的应用程序。

    目前,我能想到的最好方法是在API上点击/授权端点,redirect到Facebook OAuth,然后redirect回站点,并提供API的用户可以使用的“令牌”来validation后续要求。

  2. 对于我们创build的官方应用程序,我们不一定需要以相同的方式使用公共API。 那么与我们的网站交谈并authentication用户的最佳方式是什么?

我理解(我认为)如何使用API​​(公共)密钥和秘密(私人)密钥来authentication使用我们的API的第三方应用程序。 但是,当涉及到authentication使用该应用程序的用户时,我们对如何解决这个问题感到困惑,因为我们必须对Facebook进行身份validation。

我觉得我错过了一些非常明显的东西,或者不完全了解公共REST API应该如何工作,所以任何build议和帮助将不胜感激。

更新:见下文

我也一直在想这个问题。 这还不是完全清楚,但这是我正在考虑的路线。 我正在创build一个REST API,我的用户使用Facebook连接进行身份validation。

在客户端上:

  1. 使用Facebook APIlogin并获取OAUTH2代码。
  2. 将此代码交换为访问令牌。
  3. 在每次调用我的自定义API时,都会包含Facebook用户标识和访问令牌。

在API上(对于需要用户authentication的每种方法):

  1. 使用上面的访问令牌向/我的Facebook图表发出请求。
  2. validation返回的Facebook用户标识与从上面传递给我的API的用户标识匹配。
  3. 如果访问令牌已过期,则需要额外的通信。

我还没有testing这个。 听起来怎么样?

—更新:2014年7月27日回答问题—

我只使用上面的交换一次login。 一旦我确定哪个用户正在login,我创build了自己的访问令牌,并从那个点开始使用该令牌。 所以新的stream程看起来像这样…

在客户端上:

  1. 使用Facebook APIlogin并获取OAUTH2代码。
  2. 将此代码交换为访问令牌。
  3. 我的 API请求访问令牌,包括Facebook令牌作为参数

在API上

  1. 接收访问令牌请求。
  2. 使用Facebook访问令牌向/我的Facebook图表发出请求
  3. validationFacebook用户是否存在并与我的数据库中的用户相匹配
  4. 创build我自己的访问令牌,将其保存并将其返回给客户端,以便从此处使用

这是我使用JWT(JSON Web Tokens)的实现,基本上类似于Chris的更新的答案。 我已经使用Facebook JS SDK和JWT。

这是我的实现。

  1. 客户端:使用Facebook JS SDKlogin并获取访问令牌。

  2. 客户端:通过调用/verify-access-token端点从我的API请求JWT。

  3. MyAPI:接收访问令牌,通过调用Facebook API的/me端点进行validation。

  4. MyAPI:如果访问令牌有效,则从数据库中查找用户,如果存在则login该用户。 创build一个有必要字段的JWT作为有效载荷,设置有效期,用密钥签名并发送回客户端。

  5. 客户:将JWT存储在本地存储中。

  6. 客户端:将令牌连同请求一起发送给下一个API调用。

  7. MyAPI:使用密钥validation令牌,如果令牌有效,交换令牌为新的令牌,与API响应一起发送回客户端。 (这里没有外部API调用validation令牌)[如果令牌是无效的/过期的请求客户端再次validation并从1开始重复]

  8. 客户端将存储的令牌replace为新的令牌,并将其用于下一个API调用。 一旦令牌到期满足,令牌到期将撤消对API的访问。

每个令牌都使用一次。

阅读有关安全和JWT的更多答案

智威汤逊有多安全

如果你能解码智威汤逊他们如何安全?

JSON Web令牌(JWT)作为用户标识和身份validation令牌

我正试着回答同样的问题,最近也经历了很多的阅读。

我不会有“那个”的答案,但是对于我来说,事情正在变得越来越清晰。 你有没有读过你提到的文章中的评论? 我发现他们非常有趣和有帮助。

因此,鉴于第一篇文章写作以来的事态发展,我想我会这样做:

  • 无处不在的HTTPS – 这可以让你忘记HMAC,签名,随机数,…

  • 使用OAuth2:

    • 当身份validation请求来自我自己的应用程序/网站时,请使用前面提到的文章回复中描述的这个“技巧”(或其变体)。

    • 在我的情况下,我有两种types的用户:具有经典login/密码凭证的用户和已经注册了Facebook Connect的用户。
      所以我会提供一个“使用Facebooklogin”button的常规login表单。 如果用户使用他的“经典”凭据login,则只需使用grant_type=password将这些凭据发送到我的OAuth2端点。
      如果他select通过Facebooklogin,我认为这将是一个两步骤的过程:

      • 首先,使用Facebook iOS SDK打开一个FBSession
      • 完成后,应用程序被重新控制,应该有一种方法来获得该用户的Facebook ID。 我只能将此ID单独发送到我的OAuth2端点,并将我的服务器所理解的扩展授权标记为“使用FB用户标识”。

请注意,我仍然在大量研究这些东西,所以这可能不是一个完美的答案…也许甚至不是一个正确的答案! 但我认为这将是一个很好的起点。 使用“扩展授权”进行Facebook身份validation的想法可能涉及必须注册才能正确执行操作? 我不太确定。

无论如何,我希望我能够帮助你,至less它可以开始讨论,find这个问题的最佳解决scheme:)

更新
Facebook的注册并不是解决scheme中的注释:任何人都可以发送一个任意的用户ID,并以该用户的身份loginAPI。

怎么样这样做:

  • 用“Facebooklogin”button显示login表单
  • 如果select此login方法,请像Facebook SDK一样操作:从您的身份validation服务器打开一个网页,这将启动Facebooklogin。
  • 一旦用户login,Facebook将使用您的redirecturl来确认; 使该URL指向您的身份validation服务器的另一个端点(可能带有一个额外的参数,指示来自应用程序的调用?)
  • 当身份validation端点被击中时,身份validation可以安全地识别用户,保留其FB用户ID / FB会话并使用自定义URLscheme将访问令牌返回给您的应用程序,就像Facebook SDK将执行的一样

看起来更好?