我为node.js应用程序设计的身份验证方法是否可行?我错过了什么吗?

时间:2015-10-29 16:52:15

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

在尝试实施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与初始注册时已保存到该用户的User对象的Facebook ID匹配,则新的access_token将保存/刷新到该User对象,并且请求继续到所需的动作。

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

    提前致谢!

1 个答案:

答案 0 :(得分:3)

这不是一个好主意。我将在此详细解释原因,但一般情况下:使用护照或Stormpath等安全身份验证提供程序。原因是:安全性很难做到。特别是当您从不同的地方(网络应用程序,API,移动应用程序等)进行身份验证时。有很多方法可以解决问题,从长远来看,不仅使用经过严格审查的框架,它还会花费很多。

现在,您可以解决实施问题:

  

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

这很好,这很有道理。

  

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

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

  

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

这是一个坏主意。相反,您应该使用JWT库验证令牌(Facebook令牌是JWT)。然后,您应该使用令牌激活对Facebook Graph API的请求,以验证它是否已被撤销。这可以确保如果您的用户遭到入侵,您可以在需要时实际撤消访问权限。

  

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

以上评论也适用于此。

  

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

以上评论也适用于此。

注意:我是Node.js和Python中几个流行的身份验证库(包括社交登录)的作者,并且花费我所有的时间来处理@ my company的这些东西。

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

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

PS :无论如何,请务必在与您的API服务交谈时使用SSL,否则无论如何都不重要:(