Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
授权访问REST API中的资源_Rest - Fatal编程技术网

授权访问REST API中的资源

授权访问REST API中的资源,rest,Rest,我对构建API是新手,我很难理解如何合理地执行以下任务 有一个端点: /用户/{user_id} 它检索用户的详细信息。 前端代码将请求此端点获取有关用户的详细信息,以显示在仪表板上。 我必须保护此端点,以便不表示此用户id的用户模拟请求以获取有关其他用户的信息 由于基于REST的API是无会话的,所以我无法存储会话密钥。那么,如何确保服务器仅在用户id的所有者请求时才发送用户信息呢?你是对的。HTTP是一种无状态协议,因此REST也继承了这种特性 这是简单的交易 [REST客户端]--->[A

我对构建API是新手,我很难理解如何合理地执行以下任务

有一个端点:

/用户/{user_id}

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


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

你是对的。HTTP是一种无状态协议,因此REST也继承了这种特性

这是简单的交易

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

您有许多REST客户机,您需要确保只有经过授权的用户才会授予对API端点的访问权。@James建议的一个解决方案是使用一个令牌机制,比如JWT

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

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

中间需要一个AAu授权、身份验证服务。例如,在microservices方法中,这可以从API网关执行,该网关是您所有服务的网关

客户将向AA服务提供其用户名和密码。在exchange中,AA服务将向客户端提供一个仅由服务器签名的JSON令牌,以保护机密性。此令牌包含3个内容

指定令牌类型和用于签名的算法的标头

有效负载,包括令牌的颁发者、令牌何时到期、颁发的用户角色等声明。请参阅

由服务器密钥签名的未签名令牌的产品的签名

然后用base64对每个标头、有效负载、签名进行编码,并用。。你现在有了JWT

AA服务返回此JWT以交换凭据。 客户端应安全地存储此令牌,例如:本地存储,并且通信介质应为encryptedex:TLS。看见 之后,对于每个后续的REST调用,客户端应该包括接收到的令牌,最好是在授权报头中,尽管在技术上也可以在消息负载中发送令牌

然后,AA服务负责使用其签名密钥解密令牌,评估JWT中的声明,并根据是否授权API调用向其发送HTTP 401403响应采取行动


使用。这里会有更一般化的答案。您可以考虑JWT JSON Web令牌。如果使用JWT令牌,那么用户名不需要通过API,因为令牌可以标识用户本身。您可能需要更改API。不一定。用户id仍然需要传递到其他服务以进行查询。例如,论坛服务需要一个特定的用户id来列出他的回复/评论文章或评论。通知服务可能需要用户id才能向特定用户发送通知。但是没有必要以JWT的形式发送用户id。