java - 如何在 REST 上使用基于 token 的授权?

标签 java web-services rest swagger jwt

因此,在阅读了大量有关 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 中的身份验证引用:

4.2. Authorization

The Authorization header field allows a user agent to authenticate itself with an origin server -- usually, but not necessarily, after receiving a 401 (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/

相关文章:

ios - 使用 Monotouch 和 iOS 从服务中提取数据 (JSON) 的理想方式?

android rest servicehelper单例

php - WordPress WP REST API 按域限制请求

java - 如果我不同步这个方法,我会得到错误的值吗?

java - Android - 从服务更新 ProgressBar,这可能吗?

JAVA错误调试。

node.js - 如何在 keycloak 中调用 create user api 后获取 userId?

java - 当我添加更多接口(interface)时,C++ 对象的大小会增加……Java 会这样做吗?

java - 我可以配置 cxf 以使用特定的 XML 解析器吗?

javascript - 用于监听我自己的网络服务的推送通知的 Cordova 插件