云端终端:在Servlet过滤器中访问参数

3
我正在尝试使用Google Cloud Endpoints构建API。
由于Cloud Endpoints除了Google自己的OAuth外没有提供认证,因此我想建立自己的认证。因此,我想在servlet过滤器中访问为API提供的参数(例如@Named(“token”)token)。
不幸的是,在httpRequest中找不到任何提供的信息。这正常吗?有可能访问这些参数吗?
如果有人能帮助我,我会非常感激!
更新:
根据jirungaray的信息,我尝试使用标头构建身份验证,但遇到了同样的问题。使用REST客户端发送一些标头以访问标头中的令牌时,发现无法在API资源方法中访问自定义HTTP标题。
在我的过滤器中,我尝试从标头中访问令牌。
@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后,我有了以下Provider,使用Token来每请求注入一个FacebookClient(使用该Token)。
@Provides
public FacebookClient getFacebookClientProvider(@Named("fbToken") Provider<String> fbToken) {
    return new DefaultFacebookClient(fbToken.get(), Version.VERSION_2_2);
}

如Guice Wiki(SevletModule)中所述,这使用servlet过滤器从请求中获取信息。

有没有办法在Cloud Endpoints中实现这种依赖注入?


如果你想让你的问题得到更多的浏览量,你确实应该把 [tag:java] 作为你的标签之一。但你只有5个标签,我不确定你想要删除哪一个。可能是 [tag:guice-servlet]。 - durron597
好的。谢谢建议。我几分钟前已经删除了它。现在它又回来了! - PhilippS
您可以将鼠标悬停在标签上,查看其拥有的关注者数量和问题数量,以了解应包含哪些标签。像 [tag:guice-servlet] 这样的小标签并不能帮助任何人找到您的问题,但许多人会搜索最近标记为 [tag:java] 的帖子。因此,请选择适合您帖子的最受欢迎的标签。现在,如果我只知道如何解决您的问题... :) - durron597
有趣的是,我原本以为使用Java标签的问题只是千千万万中的一个,而在不太受欢迎的标签下,它却能引起更多关注,因为那些对该主题有全面了解的人会留意这个标签。 - PhilippS
个人而言,我大多数时候会查看标记为Java的最新/活跃问题,有时也会加入一些较小的标记(比如[标记:guice])。只有当有人遇到与你完全相同的问题时,才会看到旧的问题。 - durron597
1个回答

3

Philip,你收到空请求是有道理的。你的终端点调用首先由Google处理(他们收到API调用),然后将它们处理并发送到您应用程序中的处理程序。由于所有这些都是在后台完成的,很容易忽略您的终端点实际上没有收到您发送的相同请求,而是得到了从Google基础架构发送的完全不同的请求。

尽管您的方法应该可以工作,但在URL中包含令牌信息会使其更容易被嗅探,即使您使用SSL或加密您的参数,令牌也会以明文形式出现。

对于您想要实现的目标,我建议您将令牌作为请求标头包含在内,并通过访问终端点上的HTTP请求直接检索该标头,如果在终端点方法中包括HTTPServletRequest参数,则会自动注入此标头。

例如:

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

如果你仍然认为应该坚持原来的方法,请在评论中说明,我会帮助你调试问题。

通常我不介意使用头字段,我甚至更喜欢使用它。但是如何使用生成的客户端库设置此字段呢?在使用此头字段时,是否可以在过滤器中访问它?这将使在端点之外自动化身份验证变得更加容易。这是否会使API浏览器无法使用,因为我无法弄清楚如何在其中设置头字段? - PhilippS
我更新了问题,并提供了更具体的信息,以便解决实际问题。或许这有助于找到解决方案。 - PhilippS
你现在遇到什么问题了吗?当你使用过滤器拦截请求时,头部是否为空? - jirungaray
在我的过滤器中,我尝试使用以下代码访问头部信息:httpRequest.getHeader("token"); 但是对于已经设置的头部信息,它总是返回 null。 - PhilippS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接