授权访问REST API中的资源

时间:2017-10-18 07:34:09

标签: rest

我是构建API的新手,我无法理解如何合理地执行以下任务。

有一个终点:

  

/用户/ {USER_ID}

检索用户的详细信息。 前端代码将请求此端点获取有关要在仪表板上显示的用户的详细信息。 我必须保护此端点,以便不代表此 user_id 的用户模拟获取其他用户信息的请求。

由于基于REST的API是无会话的,我无法存储会话密钥。那么,如何确保服务器仅在用户ID的所有者请求时才发送用户信息?

1 个答案:

答案 0 :(得分:1)

你是对的。 HTTP是无状态协议,因此REST也继承了该质量。

这是简单易懂的交易。

[ REST客户端] -------> [ API端点]

您有许多REST客户端,并且您需要确保只有授权用户才能授予对API端点的访问权限。 @James建议的一个解决方案是使用令牌机制,例如JWT https://tools.ietf.org/html/rfc7519

如果您考虑JWT身份验证,则流程如下:

[ REST客户端] -------> [ AA服务] -------> [ API端点]

  • 您需要在中间使用AA(授权,身份验证)服务。例如,在微服务方法中,这可以从API网关执行,该网关是所有服务的网关。

  • 客户将向AA服务提供用户名和密码。作为交换,AA服务将为客户端提供仅由服务器签名的JSON令牌,以便保护机密性。此令牌包含3件事。

  • 标题,指定用于签名的令牌类型和算法

  • 有效负载包括发出令牌的权利,令牌何时到期,用户的角色应该是什么等等(请参阅https://tools.ietf.org/html/rfc7519#section-4

    < / LI>
  • 签名,由服务器密钥签名的未签名令牌的产品

然后使用base64对每个标题,有效负载,签名进行编码,并使用&#34;。&#34;进行连接。你现在有一个JWT。

  • AA服务返回此JWT以换取凭据。
  • 客户端应安全地存储此令牌(例如:本地存储),并且应加密通信媒体(例如:TLS)。请参阅https://stormpath.com/blog/jwt-the-right-way#how-to-secure-jwthttps://tools.ietf.org/html/rfc7519#section-6
  • 在每次后续REST调用之后,客户端应该包括收到的令牌,最好包括在Authorization标头中,尽管技术上也可以在消息有效负载中发送令牌。

  • 然后AA服务有责任使用其签名密钥解密令牌,评估JWT中的声明,并根据是否授权API调用向他发送HTTP 401,403响应。