Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用FacebookOAuth保护RESTAPI端点的可能方法_Facebook_Api_Rest_Oauth - Fatal编程技术网

使用FacebookOAuth保护RESTAPI端点的可能方法

使用FacebookOAuth保护RESTAPI端点的可能方法,facebook,api,rest,oauth,Facebook,Api,Rest,Oauth,我读了很多关于这个话题的书,但我发现的都是过时的或部分的答案,这些答案对我帮助不大,实际上只是让我更加困惑。 我正在编写一个restapi(Node+Express+MongoDB),它由一个web应用程序(托管在与API相同的域上)和一个Android应用程序访问 我希望API只能由我的应用程序和授权用户访问。 我还希望用户能够注册和登录只使用他们的Facebook帐户,我需要能够访问一些基本信息,如姓名,个人资料图片和电子邮件 我想到的一种可能的情况是: 用户使用Facebook登录web应

我读了很多关于这个话题的书,但我发现的都是过时的或部分的答案,这些答案对我帮助不大,实际上只是让我更加困惑。 我正在编写一个restapi(Node+Express+MongoDB),它由一个web应用程序(托管在与API相同的域上)和一个Android应用程序访问

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

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

  • 用户使用Facebook登录web应用程序,该应用程序被授予 访问用户Facebook信息并接收 访问令牌
  • web应用程序要求API确认此用户 实际上是在我们的系统上注册的,发送电子邮件和 Facebook收到的代币
  • API验证用户 存在时,它将用户名、令牌和密码存储到DB(或Redis)中 一个时间戳,然后返回到客户端应用程序
  • 每次 客户端应用程序点击其中一个API端点,它必须提供 用户名和令牌,而不是其他信息
  • 每次都会使用API 验证提供的配对用户名/令牌是否与most匹配 最近一对用户名/令牌存储在数据库中(使用时间戳 从我们存储到现在还不到一个小时 这些信息(再次使用时间戳)。如果是这样的话,API 将处理该请求,否则将发出未经授权的401 答复
  • 这有意义吗? 这种方法是否有我所遗漏的宏观安全漏洞? 我看到使用MongoDB存储这些信息的一个问题是,集合中很快就会充斥着旧令牌。
    从这个意义上说,我认为最好使用1小时过期策略的Redis,以便Redis自动删除旧信息。

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

  • 通过Facebook登录
  • 将FacebookAccessToken传递到服务器(通过SSL为 android应用程序,对于web应用程序,只需将其重定向到API端点即可 在FB登录后)
  • 检查给定的
    fb\u访问\u令牌
    ,确保其有效。获取
    用户id
    电子邮件
    ,并将其与现有用户交叉引用以 看看是新的还是旧的
  • 现在,创建一个随机的、单独的
    api\u access\u令牌
    ,将其返回给webapp和android应用程序。如果你需要Facebook 除登录外,请将该
    fb\u访问\u令牌
    存储在您的 DB将其与新的
    api\u访问\u令牌
    和您的
    用户id
    关联
  • 对于以后的每个调用,发送
    api\u访问\u令牌
    对其进行身份验证。如果您需要
    fb\u访问\u令牌
    获取更多信息,您可以 通过从数据库中检索它来实现
  • 总之:尽可能避免传递
    fb\u访问\u令牌
    。如果
    api\u-access\u令牌
    被破坏,那么与获得
    fb\u-access\u令牌
    相比,您有更多的控制权来查看攻击者是谁、他们在做什么等。您还可以更好地控制过期日期的设置、扩展fb\U访问令牌等


    只要确保无论何时通过HTTP传递任何类型的访问令牌,都要使用SSL

    谢谢你的快速回答。第1点和第2点很清楚,但是如何从API中准确地检查fb_access_令牌是否按照第3点有效?对
    /me
    端点进行图形调用并检查响应。好的,我明白了,因此,基本上calling/me将向我发回为用户颁发的当前访问令牌,我所要做的就是检查这两个令牌是否匹配。非常感谢。否。如果用户对象有效,则返回用户对象;如果无效,则返回错误。您好!我认为我们不能相信facebook返回的用户对象总是一封电子邮件。我昨天对此进行了测试,但在我的案例中,电子邮件没有返回。facebook sdk说:“个人资料中列出的主要电子邮件地址。如果没有可用的有效电子邮件地址,则不会返回此字段。”。我认为唯一的替代方法是使用user_id(它总是返回)在我们的后端api中创建一个用户。你怎么认为?