我使用Oltu作为Oauth2。
使用@Context HttpServletRequest请求时,我无法检索帖子数据
当我使用@FormParam时,我能够检索帖子数据。
将请求传递给OAuthTokenRequest
OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);
我收到以下错误
{"错误":" invalid_request"," error_description":"缺少grant_type参数值"}
在oltu OAuthTokenRequest类上调试时,使用以下代码来检索参数值
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请求的帖子数据 所以,我的问题是
如何使用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);
答案 0 :(得分:18)
找到解决方法(阅读评论)。
泽西岛正在消费POST数据
解决方案是包装HttpServletRequest并覆盖getParameters()
这是包装器:
public class OAuthRequestWrapper extends HttpServletRequestWrapper {
private MultivaluedMap<String, String> form;
public OAuthRequestWrapper(HttpServletRequest request, MultivaluedMap<String, String> 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<String, String> form) {
[...]
OAuthTokenRequest oauthRequest = new OAuthTokenRequest(new OAuthRequestWrapper(request, form));
[...]
}
答案 1 :(得分:2)
还有资源服务器端点无法从发布请求中检索令牌值的问题(jersey作为jax-rs实现),这是因为资源服务器代码中的验证器接口实现使用
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相关
答案 2 :(得分:0)
我发现了另一个选项,即无法在JAX-RS处理程序中获取oltu所需的参数。
不要使用HttpServletRequestWrapper对象,只需在WebFilter实现中调用HttpServletRequest.getParameterMap()方法。这将使用所有请求的参数加载请求对象的缓存参数映射,使这些参数在此请求对象的生命周期内可用。
我更喜欢这种方法,因为它使JAX-RS处理程序更清晰,而且我已经使用WebFilter拒绝访问所有非oauth请求而没有有效的令牌。
我已经证实这在泽西岛和CXF都有效。