2016-08-16 84 views
1

我(仍)正在学习JASPIC,通过简单的项目进行一些实验:this one。当我拨打受保护资源ServerAuthModule时,会通过validateRequest检查凭证并返回AuthStatus.SUCCESS。 HTTP响应是200,但它是空的。我使用这两个curl命令来测试:Jaspic:处理访问受保护的资源

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 

第一个命令是获得在第二个中使用的令牌。我用Wildfly10和RestEasy来使用Jaspic。

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

+0

请提供更多信息,例如响应的状态(如果您收到一个)和任何相关的日志条目。另外,我怀疑你需要''web.xml'中的''元素。 – Uux

回答

1

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是无法沟通的调用者的身份到运行时。由于它仍然错误地返回AuthStatus.SUCCESS,但至少就JASPIC而言,从那时起,它几乎是未定义的行为。有趣的是,好像Servlet容器在这种情况下试图让双方都满意,一方面表示SAM的AuthStatus表示认证消息交换成功,另一方面表示应用程序的<security-constraint>。诚然,401,0 403,或者更好的是,500响应 - 表示认证机制不服从其合同 - 可能不太令人困惑。

显而易见的解决方案是将运行时提供的处理程序传递给SAM。 API显然没有多大帮助,但对于单个消息层/单个应用程序/单个身份验证机制用例,仅当运行时第一次请求该处理程序时,应该足够简单地实例化ServerAuthConfig处理程序一个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端点可访问。