NC Cloud 使用openapi注意事项及问题分析切入点

NC Cloud  openapi 使用了 nginx 会报错:Request unauthorized

已邀请:

问题分析


NC Cloud 所有openapi的调用日志位于nchome/nclogs/server/下的restinfo.log中,可以根据此处的日志判断接口调用情况。

http://nccloud.yytimes.com/uploads/answer/20211012/9ddc21a7ab54fc07b6747c002caca64b.png

排查日志发现如下报错

$$ts=2021-10-11 11:30:38 $$msg=开放平台过滤器::
$$ts=2021-10-11 11:30:38 $$msg=开放平台过滤器::
$$ts=2021-10-11 11:30:38 $$msg=decrypt::provider::com.sun.crypto.provider.SunJCE
$$ts=2021-10-11 11:30:38 $$msg=>>>>>>>>>>>>>>>客户端模式获取token<<<<<<<<<<<<<<
$$ts=2021-10-11 11:30:38 $$msg=decrypt::provider::com.sun.crypto.provider.SunJCE
$$ts=2021-10-11 11:30:38 $$msg=>>>>>>>>>>>>>>>客户端模式获取token<<<<<<<<<<<<<<
$$ts=2021-10-11 11:30:38 $$msg=##get access_token::271aa1d24913037f8983acee0461c4a4
$$ts=2021-10-11 11:30:38 $$msg=###access_token###::null
$$ts=2021-10-11 11:30:38 $$msg=###tenant_id###::null
$$ts=2021-10-11 11:30:38 $$msg=Request unauthorized
nc.ws.opm.pub.exception.BizException: Request unauthorized
at nccloud.ws.opm.core.filter.OpenCloudSecurityFilter.doFilter(OpenCloudSecurityFilter.java:209)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at nccloud.framework.core.filter.CorsFilter.handleNonCORS(CorsFilter.java:456)
at nccloud.framework.core.filter.CorsFilter.doFilter(CorsFilter.java:165)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at nccloud.framework.core.filter.SecurityFilter.doFilter(SecurityFilter.java:94)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at nccloud.framework.core.filter.EntryLeaveFilter.doFilter(EntryLeaveFilter.java:54)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at nccloud.framework.core.filter.HostFilter.doFilter(HostFilter.java:47)
at com.tongweb.web.thor.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at com.tongweb.web.thor.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.tongweb.web.thor.core.ThorStandardWrapperValve.invoke(ThorStandardWrapperValve.java:202)
at com.tongweb.web.thor.core.StandardContextValve.invoke(StandardContextValve.java:297)
at com.tongweb.twnt.thor.OpenEJBValve.invoke(OpenEJBValve.java:46)
at com.tongweb.web.thor.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at com.tongweb.web.thor.core.ThorStandardHostValve.invoke(ThorStandardHostValve.java:282)
at com.tongweb.web.thor.valves.AccessLogValve.invoke(AccessLogValve.java:929)


说明请求时没有获取到鉴权信息。基于开发人员辅助分析,存在已知的问题是如项目启用了nginx等但没有做传参配置优化,可能导致鉴权信息不完整。


解决


经排查发现项目的确启用了nginx做负载均衡,则需要增加如下配置,之后重启nginx 解决。


---长连接,不设置会丢包,导致报null
---注意需要配置在server-location下,配全局可能有问题
proxy_set_header Connection keep-alive;

---传参带下划线兼容
underscores_in_headers on;

要回复问题请先登录注册