【问题标题】:Possible approach to secure a Rest API endpoints using Facebook OAuth使用 Facebook OAuth 保护 Rest API 端点的可能方法
【发布时间】:2013-03-25 04:01:09
【问题描述】:

我已经阅读了很多有关该主题的内容,但我发现的只是过时或部分答案,这对我没有太大帮助,实际上只是让我更加困惑。 我正在编写一个由 Web 应用程序(托管在与 API 相同的域上)和 Android 应用程序访问的 Rest API(Node+Express+MongoDB)。

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

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

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

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

【问题讨论】:

    标签: facebook api rest oauth


    【解决方案1】:

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

    1. 通过 Facebook 登录
    2. 将 Facebook AccessToken 传递给服务器(通过 SSL 用于 android 应用程序,对于 Web 应用程序,只需将其重定向到 API 端点 FB登录后)
    3. 检查给定的fb_access_token,确保其有效。获取user_id,email 并与现有用户交叉引用 看看是新的还是旧的。
    4. 现在,创建一个随机的、单独的 api_access_token,将其返回给 webapp 和 android 应用。如果您需要 Facebook 除了登录之外的任何内容,将 fb_access_token 存储在您的 DB 将其与新的api_access_token 和您的user_id 关联。
    5. 对于以后的每个呼叫,发送api_access_token 进行身份验证。如果您需要fb_access_token 获取更多信息,您可以 通过从数据库中检索它来做到这一点。

    总结:尽可能避免传递fb_access_token。如果api_access_token 遭到入侵,您可以更好地控制攻击者是谁、他们在做什么等,而不是让他们获得fb_access_token。您还可以更好地控制设置过期日期、延长 fb_access_tokens 等

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

    【讨论】:

    • 感谢您的快速回答。第 1 点和第 2 点很清楚,但是如何从 API 中准确检查 fb_access_token 根据第 3 点是否有效?
    • /me端点进行图形调用并检查响应。
    • 好的,我明白了,所以基本上调用 /me 会将当前为用户发布的访问令牌发回给我,我所要做的就是检查两个令牌是否匹配。谢谢!
    • 没有。如果有效则返回一个 User 对象,否则返回错误。
    • 嗨!我认为我们不能相信 facebook 返回的 User 对象总是有一封电子邮件。我昨天对此进行了测试,但在我的情况下没有退回电子邮件。 facebook sdk 说:“个人资料中列出的人的主要电子邮件地址。如果没有可用的有效电子邮件地址,则不会返回此字段”。我想唯一的选择是使用 user_id (这总是返回)在我们的后端 api 中创建一个用户。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 2015-10-29
    • 2020-07-24
    • 2012-11-03
    • 2016-03-04
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多