【发布时间】:2012-02-10 19:03:02
【问题描述】:
我有一个网络应用程序,它需要允许使用不同网络客户端(浏览器、本机移动应用程序等)的用户进行注册。登录后,他们可以访问受限内容或他们自己的内容(例如他们创建的条目等)。
到目前为止我做了什么:我创建了一个 jax-rs rest web 服务(我在 glassfish 上托管我的应用程序),它公开了以下方法:
- 注册 - 用户 POST 的他想要的用户名/密码/电子邮件/等;如果用户名/电子邮件是唯一的,则在数据库中为该用户创建一个条目(我使用 Hibernate 进行持久化)
- login - 用户 POST 的用户名和密码。如果他们没问题,就会创建一个 UUID 并将其返回给用户(这将用作未来请求的令牌)。我有一个名为 logedusers 的表,其中包含 userID、token、validSince 作为列。
这让我感到困惑。
假设我有另一个方法 getUserEntries,它应该返回用户创建的所有条目。为了更清楚地说明这一点,将有一个 Entry 表,其中包含以下字段:entryId、userId、text。
这里最好的方法是什么?
我现在要做的是发出一个获取请求并像这样传递令牌:
localhost:8080/myApp/getUserEntries?token=erf34c34
之后,如果令牌有效,我从 logedusers 表中获取用户 ID,并根据该用户 ID,获取所有条目并将它们作为 json 返回。
类似这样的:
@GET
@Path("getUserEntries")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserEntries(@QueryParam("token") String token) {
String userId=getUserIdFromToken(token);
if (userId == null){
return Response.status(Response.Status.UNAUTHORIZED).build();
} else {
//get some data associated with that userId, put it in the response object and send it back
return Response.ok().entity(response).build();
}
}
但是,如果我有更多提供数据的方法被有效用户调用,会发生什么情况?
我必须在每个方法的开头都做这个检查。
我想让这个授权过程透明
所以,这里有两个主要问题:
- 这样的设计好吗?整个过程使用用户/密码进行身份验证,服务器创建并存储令牌并将其发送给用户,用户在以后的请求中发送令牌。
- 如果我有许多端点需要确定主叫用户的身份,我该怎么办?我可以用一些注释标记它们吗,使用某种安全提供程序/身份验证器(我可以在其中添加自己的验证逻辑 - 例如检查令牌是否不超过 5 天等)。
谢谢
【问题讨论】:
标签: web-services glassfish authorization jax-rs token