如何保护移动和 AJAX 调用的 JSON RESTful API?
Posted
技术标签:
【中文标题】如何保护移动和 AJAX 调用的 JSON RESTful API?【英文标题】:how to secure a JSON RESTful API for both mobile and AJAX calls? 【发布时间】:2012-12-01 04:23:21 【问题描述】:我正在构建一个使用 node.js 和 express.js 构建的 JSON RESTful API,
客户端 AJAX 调用(来自 Ember.js)和原生 android 移动应用(标准 HTTP 请求)都可以访问 API。
我正在研究两件事:
1) 身份验证 - 如何知道哪个用户正在访问 API, 在开发中,我为每个用户使用了一个 API 密钥并在请求标头中传递了它
2) 安全性 - 如何确保只有经过身份验证的真实用户才能访问私人数据。
对于本地移动客户端和 AJAX 调用来说,API 密钥都是一个好的策略吗? (用户将 user+pass 发送到 API 并接收 API 密钥,然后用于创建其他请求)
我应该看类似 OAUTH (1 or 2) 的东西吗?我目前没有计划让第 3 方应用程序访问 API,因此我不需要授权,但这可能会在未来发生变化。
这是否意味着我需要拥有自己的 OAUTH 提供者服务器?
【问题讨论】:
OAuth 将是解决您的问题的一个很好的现有和通用解决方案,它也解决了许多可能的未来问题。你有什么理由不使用它吗? 我对 OAuth 没有任何经验,所以我先询问了策略。我需要运行自己的 OAuth 提供程序服务器吗? 您现在得到答案了吗?我也有同样的困惑。 【参考方案1】:您可以使用 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;
还有其他选择,但这是我觉得最简单的一个。
【讨论】:
以上是关于如何保护移动和 AJAX 调用的 JSON RESTful API?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 express.js 在 Ajax 调用中实现 CSRF 保护(寻找完整示例)?