首页 文章

Cloud endpoints :Servlet过滤器中的访问参数

提问于
浏览
3

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

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

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

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

UPDATE:

使用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 回答

  • 3

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

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

    例如 .

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

    如果你仍然觉得你应该采用你原来的方法只是评论,我会帮助你调试问题 .

相关问题