云端点:Servlet过滤器中的访问参数

时间:2015-04-21 11:13:11

标签: java google-app-engine guice google-cloud-endpoints servlet-filters

我正在尝试使用Google Cloud Endpoints构建api。

由于Cloud Endpoints不提供Googles自己的OAuth旁边的身份验证,我尝试构建自己的身份验证。因此,我想在servlet过滤器中访问为API提供的参数(例如@Named(" token")令牌)。

不幸的是我在httpRequest中找不到任何提供的信息。这是正常的吗?是否有可能访问参数?

如果有人可以帮助我,我将不胜感激!

更新

使用jirungaray的信息我尝试使用标头构建身份验证,但遇到了同样的问题。使用REST-Client发送一些标头,因为我无法弄清楚如何使用API​​ Explorer进行此操作。在我的过滤器中,我尝试从标题中访问令牌:

@Override
public void doFilter(
        ServletRequest request,  ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String authToken = httpRequest.getHeader(Constants.AUTH_TOKEN);
    ...
    chain.doFilter(request, response);
}

我尝试做这样的事情的原因是我使用Guice进行依赖注入并希望我的令牌被注入到另一个对象中。

使用Guice我有以下提供程序使用令牌为每个请求注入一个FacebookClient(使用令牌)。

@Provides
public FacebookClient getFacebookClientProvider(@Named("fbToken") Provider<String> fbToken) {
    return new DefaultFacebookClient(fbToken.get(), Version.VERSION_2_2);
}

如Guice wiki(SevletModule)中所述,它使用sevlet过滤器从请求中获取信息。

是否有任何解决方案可以通过Cloud Endpoints实现此类DI?

1 个答案:

答案 0 :(得分:3)

菲利普 是的,你得到一个空的请求是有道理的。您的端点调用首先由Google处理(他们接收API调用),然后处理这些调用并将其发送到您应用中的处理程序。由于这一切都是在后台完成的,因此很容易错过您的终端实际上​​没有收到您发送的相同请求,他们会收到来自Google基础架构的完全不同的请求。

即使你的方法应该有效,包括url中的令牌信息使它们更容易嗅探,即使你使用SSL或加密你的params,令牌就在那里。 对于您要实现的目标,我建议您在请求中包含令牌作为标头,并通过直接在端点上访问HTTPRequest来检索该标头,如果在端点方法中包含HTTPServletRequest参数,则会自动注入该标头。

例如

    public APIResponse doSomething(SomeComplexRquestModel request,
            HttpServletRequest rawRequest) {
}

如果您仍然觉得应该采用原始方法进行评论,我会帮助您调试问题。