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

Gal*_*aim 5 rest oauth node.js oauth-2.0 express

我正在构建一个使用node.js和express.js构建的JSON RESTful API,

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

我正在研究两件事:

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

2)安全性 - 如何确保只有真正认证的用户才能访问私有数据.

API密钥对于本机移动客户端和AJAX调用都是一个很好的策略吗?(用户将用户+传递给API并接收API密钥,然后用于创建其他请求)

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

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

ran*_*nel 0

您可以使用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) {}
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您选择走此路径,请确保在对用户进行身份验证时,还在会话中添加与用户相关的数据。这会让你的生活变得更加轻松。例子:

if(authenticated) {
    request.session.isAuth = true;
    request.session.customId = customId;
}
Run Code Online (Sandbox Code Playgroud)

还有其他选择,但这是我发现最简单的一种。