如果所有凭据都存储在客户端上,如何安全地处理REST身份验证?

时间:2017-03-06 17:31:29

标签: rest security authentication oauth api-design

我正在阅读本文档中的API最佳做法

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

之前我已经构建了简单的自定义REST API,我觉得我也设法保护它们。以前,我生成了客户端的身份验证"令牌"或服务器上的护照,并将其打印在页面上。这个想法是客户端既不能猜测也不能轻易地反向设计生成该令牌的方式,因为生成它的函数对客户端是不可见的。这是糟糕的用户体验,因为令牌会在一定时间后过期,因此页面将过期,无法向API发出新请求。

然而,我仍然不确定如何在一个已经轻微解耦的客户端上发生这种情况"从服务器的角度来看,Web服务器不会为每个请求提供页面服务。因此,客户端需要事先了解有关身份验证的信息。

我感觉这种模式会迫使我在客户端上生成或存储API身份验证详细信息,任何人都可以看到。我发现这种做法不安全,我想避免这种做法,但鉴于我所知道的信息(我承认它很稀疏),这是不可能的。

关于API安全性和身份验证,我在这种模式中缺少什么?

1 个答案:

答案 0 :(得分:3)

您使用OAuth标记了您的问题,但您没有提及它并保持广泛的问题。因此,我通过向您展示存储身份验证会话客户端的一个非常好的示例,同时使用不同的技术同时强制执行安全性,即JSON Web Token (JWT)

,我找到了相应的讨论概念。

基本流程的工作原理如下:

  1. 客户端登陆服务器并提供其凭据
  2. 服务器验证凭据,构建JWT令牌并将其注入HTTP Header
  3. 客户端会自动为每个后续请求使用此HTTP标头
  4. 服务器验证令牌,如果验证正常,则提供资源
  5. 整个过程的关键点是令牌结构及其生成。基本上,令牌保持客户端的身份验证状态。例如,它可以包含客户的角色。

    这里主要关注的是阻止客户伪造假令牌。确保完整性的技术已经存在很长时间,并且被称为HMAC。基本上,服务器注入的JWT构建如下

    header : payload : HMAC[header,payload,secret]
    

    HMAC是加密哈希,只能由知道秘密的实体生成。所以,让我们来玩一个攻击场景。

    1. 客户端登陆服务器并提供其凭据
    2. 服务器验证凭据并构建像这样的

      的JWT令牌

      header : { "alg": "HS256", "typ": "JWT" } { "sub": "1234567890", "name": "John Doe", "admin": false <--- original role } HS256{...}

    3. 客户端尝试按如下方式篡改消息:

      header : { "alg": "HS256", "typ": "JWT" } { "sub": "1234567890", "name": "John Doe", "admin": true <--- tampered role } HS256{...}

    4. 但它并不知道这个秘密,因此它无法计算出正确的HS256代码。

      1. 服务器获取客户端发送的报头和篡改的有效负载,重新计算HMAC并将其与请求中发送的HMAC进行比较。它们不匹配,因此客户端会话已被更改。比赛结束。
      2. 这是让客户端在执行安全性时存储会话的一种非常有趣的方式。