Node.js 如何为移动和AJAX调用保护JSON RESTful API?

Node.js 如何为移动和AJAX调用保护JSON RESTful API?,node.js,rest,oauth,express,oauth-2.0,Node.js,Rest,Oauth,Express,Oauth 2.0,我正在用node.js和express.js构建JSON RESTful API 该API将通过客户端AJAX调用(来自Ember.js)和本机Android移动应用程序(标准HTTP请求)访问 我正在调查两件事: 1) 身份验证-如何知道哪个用户正在访问API, 在开发过程中,我为每个用户使用了一个API密钥,并将其传递到请求头中 2) 安全性-如何确保只有真正经过身份验证的用户才能访问私有数据 对于本机移动客户端和AJAX调用,API键都是一个好策略吗? (用户向API发送user+pass

我正在用node.js和express.js构建JSON RESTful API

该API将通过客户端AJAX调用(来自Ember.js)和本机Android移动应用程序(标准HTTP请求)访问

我正在调查两件事:

1) 身份验证-如何知道哪个用户正在访问API, 在开发过程中,我为每个用户使用了一个API密钥,并将其传递到请求头中

2) 安全性-如何确保只有真正经过身份验证的用户才能访问私有数据

对于本机移动客户端和AJAX调用,API键都是一个好策略吗? (用户向API发送user+pass并接收API密钥,然后用于创建其他请求)

我应该看看OAUTH(1或2)之类的东西吗?我目前没有计划让第三方应用程序访问API,因此我不需要授权,但这在将来可能会改变


这是否意味着我需要拥有自己的OAUTH提供程序服务器?

您可以使用express.js会话进行正常身份验证,会话密钥存储在会话存储中。为了与非cookie REST调用兼容,您可以使用添加到查询或请求正文中的附加字段“mySessionId”。然后修改身份验证以检查该额外字段。 也许举个例子更有用:

简而言之:

var server = express.createServer();
server.use(express.cookieParser());
server.use(express.session(sessionInfoObject));
server.get("/path/to/endpoint", function(request, response) {
    if(typeof(request.query.mySessionId) != "undefined") {
        // authenticate with the session id in mySessionId
        // eg: if (getSession(request.query.mySessionId).isAuth) {}
    }
    else {
        // session authentication, use request.session
        // eg: if (getSession(request.query.mySessionId).isAuth) {}
    }
});
如果选择此路径,请确保在对用户进行身份验证时,还可以在会话中添加与用户相关的数据。这会让你的生活轻松很多。例如:

if(authenticated) {
    request.session.isAuth = true;
    request.session.customId = customId;
}

有替代方案,但这是我发现最简单的方案。

OAuth将是解决您的问题的一个很好的现有通用解决方案,它还解决了许多未来可能出现的问题。你有什么理由不使用它吗?我对OAuth没有任何经验,所以我先问了一下策略。。我需要运行自己的OAuth提供程序服务器吗?您现在得到答案了吗?我有同样的难题。