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