【问题标题】:Is my devised authentication method for node.js app viable? Am I missing anything?我为 node.js 应用程序设计的身份验证方法是否可行?我错过了什么吗?
【发布时间】:2026-01-29 21:40:01
【问题描述】:

在尝试实现 Passport 模块并决定我对不知道幕后发生的确切情况感到很不自在后,我想出了自己的方法来使用 Facebook 验证移动用户的身份。以下是我的方法,但我担心我可能会错过一些重要的东西,因为我是新手。任何见解将不胜感激。

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

  1. 移动客户端使用 Facebook API 对用户进行身份验证并接收 access_token。

  2. 对我的 node.js 服务器的每个后续请求都将包含该用户的唯一 ID 和当前 Facebook access_token。

  3. 请求将通过 Sails.js 策略(中间件),该策略将请求中的 Facebook access_token 与当前保存到数据库中该用户的 User 对象的 access_token 进行比较。

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

  5. 如果从 Facebook 服务器返回的唯一 Facebook ID 与初始注册时已保存到该用户的用户对象的 Facebook ID 匹配,则新的 access_token 将保存/刷新到该用户对象,并且请求继续到所需的行动。

同样重要:移动客户端会自动刷新 Facebook access_token 并根据需要将其包含在对我的服务器的请求中。

提前致谢!

【问题讨论】:

  • 您是否为存储在服务器/客户端机器上的令牌实施任何超时机制?

标签: node.js facebook-graph-api authentication server sails.js


【解决方案1】:

这不是一个好主意。我将在这里详细解释原因,但一般来说:使用护照或安全身份验证提供程序,如Stormpath。原因是:安全性很难做到正确。尤其是当您从不同的地方(网络应用程序、API、移动应用程序等)进行身份验证时。有很多方法可以把事情搞砸,从长远来看,不仅仅是使用经过严格审查的框架,这可能会让你付出很多代价。

现在,以下是您的实施问题的细分:

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

这很好,这是有道理的。

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

唯一 ID 在哪里生成?是 Facebook 用户 ID 吗?如果是这样,请不要在令牌之外传递此令牌 - 将其保留在内部并且仅通过 HTTP 授权标头传递令牌。这将确保您泄露尽可能少的信息。

请求将通过一个sails.js 策略(中间件) 将请求中的 Facebook access_token 与 access_token 当前从数据库中保存到该用户的 User 对象中。

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

如果它们匹配,请求将继续执行所需的操作。如果 他们不匹配,服务器将拨打电话 tograph.facebook.com/me/?access_token= 提供访问令牌 来自请求。

上面的 cmets 在这里也适用。

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

上面的 cmets 在这里也适用。


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

身份验证真的很有趣/有趣,但除非你绝对 100% 确定你做的一切都是正确的,否则使用经过严格审查的框架总是一个更好的主意 =)

我真的希望这会有所帮助!祝你的项目好运!我相信它会很棒。

PS:无论如何,在与您的 API 服务通信时一定要使用 SSL,否则这些都不重要:(

【讨论】:

  • 如果我按照您解释的方式修改了策略,只传递了令牌并使用 graph.facebook.com 请求来检索用户标识符,我还有其他几个问题。如果我在我的用户模型中使用他们的 FB ID 或电子邮件地址作为他们的唯一标识符,这有关系吗?还有什么我需要做的吗?我坚持只是因为我对网络安全感兴趣并且我想尽可能多地学习。我目前正在阅读一本关于渗透测试的书,并且可以看到自己将来会用它做一些事情。
  • 非常感谢您的详细回答。最好现在就找出我的错误,而不是下线。
  • 乐于助人。关于您的用户模型,我会在您的应用中使用用户的 Facebook ID 作为主键/标识符。
最近更新 更多