所以在阅读了很多关于BasicAuth,OAuth,JWT ......之后我想出了这个问题。
我有一个客户端,其中一些ppl可以登录(身份验证已完成)。当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 }
现在我不希望每个用户都拥有每次reosurce的所有权利,所以我愿意 需要添加一些有关正在执行请求的用户的信息。
为此,我想使用一些JSON令牌和一些有效负载(或任何用户信息)。但我想知道如何在RESTful API中正确发送此令牌。
我的第一个想法是将代码更改为:
//id=path, token=post
public Response updateResourceById(String id, Token token) {
...
端点不会仅更改POST数据。
这是正确的还是有其他方法?
编辑:也可以通过HTTP标头发送令牌。
答案 0 :(得分:1)
在HTTP中,凭据应在标准HTTP Authorization
标头中发送。
查看RFC 7235,HTTP 1.1中当前的身份验证参考:
Authorization
标头字段允许用户代理进行身份验证 本身与原始服务器 - 通常,但不一定,后 收到401
(未经授权)回复。它的价值包括 包含用户身份验证信息的凭据 代理请求的资源领域。Authorization = credentials
[...]
请注意,此HTTP标头的名称很不幸,因为它带有身份验证数据而不是授权。无论如何,这是发送凭据的标准标题。
在基于令牌的身份验证中,令牌是凭据。在此方法中,用户名和密码等硬凭证将交换为在每个请求中发送以识别用户的令牌。
在通过网络发送敏感数据(例如凭据)时,您应该使用HTTPS,这绝非易事。 HTTPS将保护您的应用程序免受man-in-the-middle attack。
的攻击您可以按照以下方式阅读JAX-RS应用程序中的Authorization
标头,然后检查令牌是否有效:
@GET
public Response myMethod(@HeaderParam("Authorization") String token) {
...
}
但是,更好的方法是使用ContainerRequestFilter
,保持端点倾斜并专注于业务逻辑。有关基于令牌的身份验证以及如何使用ContainerRequestFilter
的详细信息,请查看此question。