我正在尝试使用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?
答案 0 :(得分:3)
菲利普 是的,你得到一个空的请求是有道理的。您的端点调用首先由Google处理(他们接收API调用),然后处理这些调用并将其发送到您应用中的处理程序。由于这一切都是在后台完成的,因此很容易错过您的终端实际上没有收到您发送的相同请求,他们会收到来自Google基础架构的完全不同的请求。
即使你的方法应该有效,包括url中的令牌信息使它们更容易嗅探,即使你使用SSL或加密你的params,令牌就在那里。
对于您要实现的目标,我建议您在请求中包含令牌作为标头,并通过直接在端点上访问HTTPRequest来检索该标头,如果在端点方法中包含HTTPServletRequest
参数,则会自动注入该标头。
例如
public APIResponse doSomething(SomeComplexRquestModel request,
HttpServletRequest rawRequest) {
}
如果您仍然觉得应该采用原始方法进行评论,我会帮助您调试问题。