因此,在阅读了大量有关 BasicAuth、OAuth、JWT...等的内容后,我提出了这个问题。
我有一个客户端,一些人可以登录(身份验证已完成)。当 ppl 想要进行 api 调用时,他们使用客户端 GUI,并且客户端向 Web 服务端点发送一些请求。
host/resources/{id}
//id=path, res=post
public Response updateResourceById(String id, Resource res) {
....
所以典型的更新调用可能是
POST host/resources/1234 -d={ some json for a resource }
现在我不希望每个用户都拥有每个资源的所有权利,所以我会 需要添加一些有关正在发出请求的用户的信息。
为此,我正在考虑使用一些 JSON token 和一些有效负载(或任何用户信息)。但我想知道如何在 RESTful API 中正确发送此 token 。
我的第一个想法是将代码更改为如下所示:
//id=path, token=post
public Response updateResourceById(String id, Token token) {
...
端点不会仅更改 POST 数据。
这是正确的还是还有其他方法?
编辑:也可以通过 HTTP header 发送 token 。
最佳答案
通过 HTTP 发送凭据
在 HTTP 中,凭据应以标准 HTTP Authorization
发送 header 。
看看 RFC 7235 ,当前 HTTP 1.1 中的身份验证引用:
The
Authorization
header field allows a user agent to authenticate itself with an origin server -- usually, but not necessarily, after receiving a401
(Unauthorized) response. Its value consists of credentials containing the authentication information of the user agent for the realm of the resource being requested.Authorization = credentials
[...]
请注意,此 HTTP header 的名称很不幸,因为它携带身份验证数据,而不是授权。无论如何,这是发送凭据的标准 header 。
在基于 token 的身份验证中, token 是凭据。在这种方法中,用户名和密码等硬凭证会被交换为在每个请求中发送的 token ,以识别用户。
说你应该使用 HTTPS 也没什么坏处。通过线路发送敏感数据(例如凭据)时。 HTTPS 将保护您的应用程序免受 man-in-the-middle attack 的侵害.
读取 JAX-RS 中的身份验证 token
您可以阅读Authorization
JAX-RS 应用程序中的 header 如下所示,然后检查 token 是否有效:
@GET
public Response myMethod(@HeaderParam("Authorization") String token) {
...
}
但是,更好的方法是使用 ContainerRequestFilter
,保持端点倾斜并专注于业务逻辑。有关基于 token 的身份验证以及如何使用 ContainerRequestFilter
的更多信息,看看这个question .
关于java - 如何在 REST 上使用基于 token 的授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35359412/