使用Oltu传递给OAuthTokenRequest时无法使用@ Context HttpServletRequest检索发布数据

我正在使用Oltu作为Oauth2。

使用@Context HttpServletRequest请求时,我无法检索发布数据

当我使用@FormParam时,我能够检索发布数据。

在将请求传递给OAuthTokenRequest时

OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request); 

我收到了以下错误

{“error”:“invalid_request”,“error_description”:“缺少grant_type参数值”}

在oltu OAuthTokenRequest类上进行调试时,使用以下代码来检索param值

 public String getParam(String name) { return this.request.getParameter(name); // from request it is unable to get post data.As i am getting request object using @Context HttpServletRequest request . } 

据说使用@Context HttpServletRequest请求无法获取使用@Context HttpServletRequest请求的post数据所以,我的问题是

如何在jax-ws中获取带有post数据的HttpServletRequest请求,以便我可以将HttpServletRequest请求传递给OAuthTokenRequest这是我的代码

 @Path("/token") public class TokenEndpoint { @POST @Consumes("application/x-www-form-urlencoded") @Produces("application/json") public Response authorize(@FormParam("state") String state,@Context HttpServletRequest request) throws OAuthSystemException { try { // here I am unable to get value of request.getParameter("state") // but using (@FormParam("state") I am able to get value of post parameter state request.getParameter("state"); // exception is thrown from following code OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request); 

找到了解决方法(阅读评论)。

OLTU问题#26

泽西岛正在消费POST数据。
解决方案是包装HttpServletRequest并覆盖getParameters()
这是包装器:

 public class OAuthRequestWrapper extends HttpServletRequestWrapper { private MultivaluedMap form; public OAuthRequestWrapper(HttpServletRequest request, MultivaluedMap form) { super(request); this.form = form; } @Override public String getParameter(String name) { String value = super.getParameter(name); if (value == null) { value = form.getFirst(name); } return value; } } 

这是如何实现令牌POST方法:

 @POST @Path("/token") @Consumes("application/x-www-form-urlencoded") @Produces("application/json") public Response token(@Context HttpServletRequest request, MultivaluedMap form) { [...] OAuthTokenRequest oauthRequest = new OAuthTokenRequest(new OAuthRequestWrapper(request, form)); [...] } 

还有资源服务器端点无法从发布请求中检索令牌值的问题(jersey作为jax-rs实现),这是因为资源服务器代码中的validation器接口实现使用

 httpServletRequest.getParameterValues(param); 

这个问题可以通过在Matteo提出的同一个HttpServletRequestWrapper中覆盖String [] getParameterValues(String)来解决,注意额外条件,它对于捕获空令牌请求很重要(如果没有传递令牌,该方法应该返回null):

 @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if(values == null && form.get(name) != null){ values = new String[form.get(name).size()]; values = form.get(name).toArray(values); } return values; } 

相关的apache oltu 1.0.0

我发现了另一个选项,即无法在JAX-RS处理程序中获取oltu所需的参数。

而不是使用HttpServletRequestWrapper对象,只需在WebFilter实现中调用HttpServletRequest.getParameterMap()方法。 这将使用所有请求的参数加载请求对象的缓存参数映射,使这些参数可用于此请求对象的生命周期。

我更喜欢这种方法,因为它使JAX-RS处理程序更清晰,而且我已经使用WebFilter拒绝访问所有非oauth请求而没有有效的令牌。

我已经在Jersey和CXFvalidation了这个function。