使用Facebook OAuth保护Rest API端点的可能方法

时间:2013-03-24 19:02:00

标签: facebook api rest oauth

我一直在阅读很多关于这个主题的内容,但我发现的所有内容都是过时的或部分的答案,这些并没有真正帮助我,实际上只是让我更加困惑。 我正在编写一个Rest API(Node + Express + MongoDB),它可以通过Web应用程序(托管在与API相同的域上)和Android应用程序访问。

我希望API只能由我的应用程序访问,并且只能由授权用户访问。 我还希望用户只能使用他们的Facebook帐户进行注册和登录,我需要能够访问一些基本信息,如姓名,个人资料照片和电子邮件。

我想到的一个可能的情况是:

  1. 用户使用Facebook登录Web应用程序,该应用程序被授予 允许访问用户Facebook信息并接收 访问令牌。
  2. 网络应用要求API确认此用户 实际上是在我们的系统上注册,发送电子邮件和 Facebook收到的令牌。
  3. API验证用户 存在,它存储在DB(或Redis)中的用户名,令牌和 时间戳,然后返回客户端应用程序。
  4. 每次都是 客户端应用程序点击其中一个API端点,它将不得不提供 用户名和令牌,而不是其他信息。
  5. 每次API 验证提供的对用户名/令牌是否匹配最多 最近的对用户名/令牌存储在数据库中(使用时间戳 订购),自我们存储以来不超过1小时 这些信息(再次使用时间戳)。如果是这样的话,API 将处理请求,否则将发出401 Unauthorized 响应。
  6. 这有意义吗? 这种方法是否有任何我遗漏的宏观安全漏洞? 我使用MongoDB来存储这些信息的一个问题是,使用旧令牌,集合很快就会变得臃肿。 从这个意义上讲,我认为最好使用Redis的过期策略为1小时,以便Redis自动删除旧信息。

1 个答案:

答案 0 :(得分:33)

我认为更好的解决方案是:

  1. 通过Facebook登录
  2. 将Facebook AccessToken传递给服务器(通过SSL获取 Android应用程序,对于Web应用程序,只需将其重定向到API端点 FB登录后)
  3. 检查给定的fb_access_token,确保其有效。获取user_idemail并与现有用户交叉引用 看它是新的还是旧的。
  4. 现在,创建一个随机的,单独的api_access_token,您将回馈给webapp和Android应用程序。如果你需要Facebook 登录以外的任何内容,存储fb_access_token和您的。{1}} 数据库将其与新的api_access_token和您的user_id
  5. 相关联
  6. 对于此后的每次通话,请发送api_access_token进行身份验证。如果您需要fb_access_token来获取更多信息,则可以 通过从DB中检索来实现。
  7. 总结:只要有可能,请避免传递fb_access_token。如果api_access_token被泄露,您可以更好地控制攻击者是谁,他们正在做什么等等,而不是他们要获得fb_access_token。您还可以更好地控制设置的到期日期,扩展fb_access_token等等

    只要确保无论何时通过HTTP传递任何类型的access_token,都要使用SSL。