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

s0n*_*ica 22 api rest facebook oauth

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

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

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

  1. 用户使用Facebook登录Web应用程序,该应用程序被授予访问用户Facebook信息和接收访问令牌的权限.
  2. Web应用程序要求API确认此用户实际在我们的系统上注册,发送电子邮件和Facebook收到的令牌.
  3. API验证用户是否存在,它将用户名,令牌和时间戳存储到DB(或Redis)中,然后返回到客户端应用程序.
  4. 每次客户端应用程序访问其中一个API端点时,除了其他信息之外,它必须提供用户名和令牌.
  5. 每次API都会验证提供的对用户名/令牌是否与存储在数据库中的最新对用户名/令牌匹配(使用订购时间戳),并且自我们存储这些信息后不超过1小时(再次使用时间戳).如果是这种情况,API将处理请求,否则将发出401 Unauthorized响应.

这有意义吗?这种方法是否有任何我遗漏的宏观安全漏洞?我使用MongoDB来存储这些信息的一个问题是,使用旧令牌,集合很快就会变得臃肿.从这个意义上来说,我认为最好使用Redis的过期策略为1小时,以便Redis自动删除旧信息.

Tom*_*ush 33

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

  1. 通过Facebook登录
  2. 将Facebook AccessToken传递给服务器(通过SSL为Android应用程序,对于Web应用程序,只需在FB登录后将其重定向到API端点)
  3. 检查fb_access_token给定的,确保其有效.获取user_id,email和交叉引用这与现有用户查看其新的或旧的.
  4. 现在,创建一个随机的,单独的api_access_token,你回馈webapp和Android应用程序.如果您需要Facebook以外的其他任何东西,请将其存储fb_access_token在您的数据库中,并将其与新的api_access_token和您的user_id.
  5. 对于以后的每次通话,请发送api_access_token以进行身份​​验证.如果您需要fb_access_token获取更多信息,可以通过从DB中检索它来实现.

总结:每当你可以,避免通过fb_access_token.如果api_access_token受到损害,您可以更好地控制攻击者是谁,他们正在做什么等等,而不是他们是否能够获得攻击者fb_access_token.您还可以更好地控制设置的到期日期,扩展fb_access_tokens等

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