我正在阅读本文档中的API最佳做法
http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
之前我已经构建了简单的自定义REST API,我觉得我也设法保护它们。以前,我生成了客户端的身份验证"令牌"或服务器上的护照,并将其打印在页面上。这个想法是客户端既不能猜测也不能轻易地反向设计生成该令牌的方式,因为生成它的函数对客户端是不可见的。这是糟糕的用户体验,因为令牌会在一定时间后过期,因此页面将过期,无法向API发出新请求。
然而,我仍然不确定如何在一个已经轻微解耦的客户端上发生这种情况"从服务器的角度来看,Web服务器不会为每个请求提供页面服务。因此,客户端需要事先了解有关身份验证的信息。
我感觉这种模式会迫使我在客户端上生成或存储API身份验证详细信息,任何人都可以看到。我发现这种做法不安全,我想避免这种做法,但鉴于我所知道的信息(我承认它很稀疏),这是不可能的。
关于API安全性和身份验证,我在这种模式中缺少什么?
答案 0 :(得分:3)
您使用OAuth标记了您的问题,但您没有提及它并保持广泛的问题。因此,我通过向您展示存储身份验证会话客户端的一个非常好的示例,同时使用不同的技术同时强制执行安全性,即JSON Web Token (JWT)
,我找到了相应的讨论概念。基本流程的工作原理如下:
整个过程的关键点是令牌结构及其生成。基本上,令牌保持客户端的身份验证状态。例如,它可以包含客户的角色。
这里主要关注的是阻止客户伪造假令牌。确保完整性的技术已经存在很长时间,并且被称为HMAC。基本上,服务器注入的JWT构建如下
header : payload : HMAC[header,payload,secret]
HMAC是加密哈希,只能由知道秘密的实体生成。所以,让我们来玩一个攻击场景。
服务器验证凭据并构建像这样的
的JWT令牌 header : {
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": false <--- original role
}
HS256{...}
客户端尝试按如下方式篡改消息:
header : {
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true <--- tampered role
}
HS256{...}
但它并不知道这个秘密,因此它无法计算出正确的HS256代码。
这是让客户端在执行安全性时存储会话的一种非常有趣的方式。