15

我正在将 Oltu 用于 Oauth2。

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

当我使用 @FormParam 时,我能够检索帖子数据。

将请求传递给 OAuthTokenRequest

OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);

我收到以下错误

{"error":"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);
4

3 回答 3

19

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

OLTU 问题 #26

Jersey 正在使用 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));

    [...]

}
于 2014-03-20T17:17:10.713 回答
2

还有资源服务器端点无法从发布请求中检索令牌值的问题(球衣作为 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 相关

于 2014-08-13T13:07:20.300 回答
0

我找到了另一个选项来解决这个限制,即无法在 JAX-RS 处理程序中获取 oltu 所需的参数。

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

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

我已经验证了这在泽西岛和 CXF 中都有效。

于 2016-03-30T18:33:27.007 回答