Node.js 用于移动应用程序和第三方应用程序的带NodeJS的Resftul Api

Node.js 用于移动应用程序和第三方应用程序的带NodeJS的Resftul Api,node.js,api,express,oauth,passport.js,Node.js,Api,Express,Oauth,Passport.js,我正在用NodeJS开发一个restfulapi,它将服务于特定的移动应用程序和(可能在将来)其他第三方应用程序 经过一些搜索,我决定在开发API时使用ExpressJS作为中间件,Mongoose用于mongo相关操作,PassportJS用于身份验证 但在我的脑海中仍然有一些关于基础设施的问题,我希望你们能启发我 我应该如何保护我的API?首先我想,我可以用OAuth保护所有API端点;但如果使用OAuth,移动应用程序如何使用API 因为第一个问题,我想;我应该开发两个API。一个用于移动

我正在用NodeJS开发一个restfulapi,它将服务于特定的移动应用程序和(可能在将来)其他第三方应用程序

经过一些搜索,我决定在开发API时使用ExpressJS作为中间件,Mongoose用于mongo相关操作,PassportJS用于身份验证

但在我的脑海中仍然有一些关于基础设施的问题,我希望你们能启发我

  • 我应该如何保护我的API?首先我想,我可以用OAuth保护所有API端点;但如果使用OAuth,移动应用程序如何使用API

  • 因为第一个问题,我想;我应该开发两个API。一个用于移动应用的私有API;和一个用于第三个应用程序的公共API。我应该吗

  • 这是我的第一个NodeJS应用程序,所以我读了很多关于它的东西。但它们似乎都是为“Hello World”的例子而写的。是否有任何文章或教程真正帮助我开发真实世界的应用程序

  • 问题1和2 OAuth(2)是一个不错的选择,您也可以安全地将其用于内部和外部应用程序。与PassportJS相同的作者还创建了一个OAuth2服务器,它可以很好地与PassportJS配合使用。
    使用OAuth2是安全可靠的,您和其他人可以使用大量的第三方库。
    然而

  • 使用OAuth2通常需要用户每次都进行身份验证。如果在登录页面中添加“记住我的密码”功能,则用户无需再次键入密码,但仍需要打开一个web框架。
    一个可能的解决方案是使用过期时间长(如果有过期的话)的身份验证令牌,但是您需要确保它们被安全地传输和存储。通常,用户总是会得到一个短寿命代币,然后可以将其兑换成一个长寿命代币。这样做的原因是为了避免在响应URL中发送长寿令牌(只有在创建移动应用程序时才可选择)。将短期代币兑换为长期代币的请求通常需要使用应用程序密钥进行签名,以增加安全性(尽管在移动应用程序中,永远不可能完全保护应用程序密钥)
  • 拥有两个不同的认证系统可能是一种选择。它当然更容易(如果它允许您延迟OAuth2的实现),更集成到您的应用程序中(您不需要加载web视图让用户登录),而且同样安全。你的应用程序中会有一个表单,要求输入用户名和密码并将其发送到服务器。然后,服务器使用“访问令牌”进行响应,该令牌的过期日期很长(如果有)
  • 当然,您应该确保所有的API调用都是通过SSL进行的。不仅是在发送密码时,而且在发送任何后续请求时,因为您将发送访问令牌(与会话的“密码”类似,永远不会过期)

    问题3
    PassportJS还提供了一个可以让您开始的功能,不仅是PassportJS,还有Node。

    谢谢您的回答,但首先我想问一下您对OAuth2的看法?起初我想用OAuth2,但读完这篇文章后我放弃了。@bahadirarslan世界上所有的大公司都在采用OAuth2,从Facebook到谷歌。规范是明确的,经过深思熟虑的,正如那篇文章本身所说,它们是安全的。他的批评者主要关注第三方可能出现的错误实现。如果你坚持使用公共的、经过测试的图书馆,并且考虑你在做什么,我怀疑你会有任何问题。