我为node.js应用设计的身份验证方法可行吗?我遗漏了什么吗?

我为node.js应用设计的身份验证方法可行吗?我遗漏了什么吗?,node.js,facebook-graph-api,authentication,server,sails.js,Node.js,Facebook Graph Api,Authentication,Server,Sails.js,在尝试实现Passport模块后,我觉得不知道幕后到底发生了什么太不舒服了,于是我想出了自己的方法,用Facebook验证手机用户的身份。以下是我的方法,但我担心我可能会错过一些重要的东西,因为我是新手。如有任何见解,将不胜感激 重要提示:每个用户都必须登录Facebook 移动客户端使用Facebook API对用户进行身份验证,并接收访问令牌 对my node.js服务器的每个后续请求以及用户特定/特权操作都将包含该用户的唯一ID和当前Facebook访问令牌 请求将通过一个sails.js

在尝试实现Passport模块后,我觉得不知道幕后到底发生了什么太不舒服了,于是我想出了自己的方法,用Facebook验证手机用户的身份。以下是我的方法,但我担心我可能会错过一些重要的东西,因为我是新手。如有任何见解,将不胜感激

重要提示:每个用户都必须登录Facebook

  • 移动客户端使用Facebook API对用户进行身份验证,并接收访问令牌

  • 对my node.js服务器的每个后续请求以及用户特定/特权操作都将包含该用户的唯一ID和当前Facebook访问令牌

  • 请求将通过一个sails.js策略(中间件),该策略将来自请求的Facebook访问令牌与当前从数据库保存到该用户用户对象的访问令牌进行比较

  • 如果它们匹配,请求将继续执行所需的操作。如果它们不匹配,服务器将使用请求提供的访问令牌调用
    graph.facebook.com/me/?access\u token=

  • 如果从Facebook服务器返回的唯一Facebook ID与初始注册时已保存到该用户用户对象的Facebook ID匹配,则新的access_令牌将保存/刷新到该用户对象,请求将继续执行所需操作

  • 同样重要的是:移动客户端将自动刷新Facebook access_令牌,并根据需要将其包含在对我的服务器的请求中


    提前谢谢

    这不是个好主意。我将在这里详细解释原因,但一般来说:使用passport或类似的安全身份验证提供商。原因是:安全问题很难解决。尤其是当您从不同的地方(web应用程序、API、移动应用程序等)进行身份验证时。有很多方法可以把事情搞砸,而且从长远来看,不仅仅是使用一个经过良好审查的框架,可能会让你付出很多代价

    现在,这里是您的实现问题的分解:

    移动客户端使用Facebook API对用户进行身份验证并接收 访问令牌

    这很好,这很有意义

    对my node.js服务器的每个后续请求 用户特定/特权操作将包含该用户的唯一ID 和当前的Facebook访问令牌

    在哪里生成唯一ID?是Facebook的用户ID吗?如果是这样的话,不要将其传递到令牌外部——将其保持在内部,并且只通过HTTP授权头传递令牌。这将确保您尽可能少地泄漏信息

    请求将通过一个sails.js策略(中间件),该策略 将请求中的Facebook access_令牌与 从数据库访问当前保存到该用户的用户对象的\u令牌

    这是个坏主意。相反,您应该使用JWT库验证令牌(Facebook令牌是JWT)。然后,您应该向Facebook Graph API发出一个请求,并使用令牌验证它是否已被撤销。这确保了如果您的用户受到威胁,您可以在需要时撤销访问权

    如果它们匹配,请求将继续执行所需的操作。如果 他们不匹配,服务器会打电话 tograph.facebook.com/me/?access\u token=带有提供的访问令牌 从请求中删除

    上述评论在这里也适用

    如果从Facebook服务器返回的唯一Facebook ID与 已保存到该用户的用户对象的Facebook ID 初始注册,然后将新的访问令牌保存/刷新到 该用户对象和请求继续执行所需的操作

    上述评论在这里也适用


    注意:我是Node.js和Python中几个流行的身份验证库(包括社交登录)的作者,我的所有时间都花在了@my company上

    身份验证真的很有趣,但除非您完全100%确定自己做的每件事都绝对正确,否则最好使用经过良好审查的框架=)

    我真的希望这有帮助!祝你的项目好运!我肯定会很棒的


    PS:不管怎样,在与API服务通话时一定要使用SSL,否则这些都无关紧要:(

    您是否为存储在服务器/客户端计算机上的令牌实施了超时机制?如果我按照您解释的方式修改了策略,只传递令牌并使用graph.facebook.com请求检索用户标识符,我还有几个其他问题。我是否使用他们的FB ID或电子邮件地址作为密码他们在我的用户模型中的唯一标识符?还有什么我需要做的吗?我坚持下去只是因为我对网络安全感兴趣,我想尽可能多地学习。我目前正在阅读一本关于渗透测试的书,可以看到我自己在将来用它做一些事情。非常感谢您提供的详细答案。更好现在就来找出我的错误,而不是直接说出来。很乐意提供帮助。关于你的用户模型,我会使用用户的Facebook ID作为你应用程序中的主键/标识符。