Jaspic:处理对受保护资源的访问

Jaspic: handle access to a protected resource

我(仍在)研究 JASPIC,通过简单的项目做一些实验:this one。当我调用受保护资源时,ServerAuthModule 通过 validateRequest 和 returns AuthStatus.SUCCESS 检查凭据。 HTTP 响应为 200,但它是空的。我用这两个curl命令来测试:

curl -H "Content-Type: application/json" -X POST -d '{"username":"xxx","password":"xxx"}' http://localhost:8080/JaspicWeb/services/user/login
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE0NzE1ODcsInN1YiI6InVzZXJBIn0.Gyf7w2192vlz3uSwjwtf8z1p9n9k3IqtQMQrubA7oYI" -X GET http://localhost:8080/JaspicWeb/services/user/userA

第一个命令是获取第二个命令中使用的令牌。我将 Jaspic 与 Wildfly10 和 RestEasy 一起使用。

更新: 我更新了链接的项目。现在它是一个完整的工作 Jaspic 示例。

SAM 的 CallbackHandler 是你麻烦的原因。

首先it.jaspic.sec.TokenConfigProvider忽略运行时传递给它的处理程序:

public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException {
  return serverAuthConfig;
}

然后it.jaspic.sec.TokenServerConfig使用它自己的处理程序,它基本上什么也不做:

public TokenServerConfig() throws AuthException {
  // ...
  handler = new CallbackHandler() {
    @Override
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
      // just logs its arguments
    }
  };
}

因此,it.jaspic.sec.TokenSAM#validateRequest 无法将调用者的身份传达给运行时。由于它仍然错误地 returns AuthStatus.SUCCESS,从那时起它几乎是未定义的行为,至少就 JASPIC 而言是这样。有趣的是,在这种情况下,Servlet 容器似乎试图让双方都满意,一方面是通过尊重 SAM 的 AuthStatus 表明成功的身份验证消息交换,另一方面是应用程序的 <security-constraint> 另一方面。诚然,401403,或者更好的是,500 响应——表明身份验证机制不遵守其合同——可能不会那么令人困惑。

显而易见的解决方案是将 运行时提供的 处理程序传递给 SAM。 API 显然没有多大帮助,但对于单个消息 layer/single app/single 身份验证机制用例,只需延迟实例化 ServerAuthConfig [=41] 就足够了=]with 处理程序,当运行时通过 getServerAuthConfig 调用首次请求它时:

public synchronized ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) {
  if (serverAuthConfig == null) {
    serverAuthConfig = new TokenServerConfig(handler);
  }
  return serverAuthConfig;
}

当然,上面调用的新构造函数(只需要存储处理程序参数)必须引入 it.jaspic.sec.TokenServerConfig

这两项更改应该使 /services/user/userA 端点可访问。