问题描述
此问题是单点登录转发问题,客户服务器域名访问一个本程序对外接口获取token,并跳转至本系统登录页面,在网关日志中发现token为空的异常。
问题排查
1、拿token在postman中发送,发现请求是成功的,本程序通过nginx代理配置,检查代理配置,经过一番排查没有问题
2、检查程序,也没有问题
3、那么问题就出现在了域名转发上,这个域名转发会篡改请求头的Authorization中的token,导致登录失败,而客这个域名转发是客户服务器,我们改不了,所以只能选择替代方案。
问题解决
替代方案1: 将用户的token放在url中进行拼接,前端修改axios实例,后端修改,如果获取不到请求头中的token,在参数中的取。
此方案弊端很大,第一是token暴露,第二是url参数有限制,某些请求会失败。
替代方案2:自定义请求头,在axios中修改,在后台修改校验取自定义请求头
替代方案1:
List<String> strings = request.getHeaders().get(userAuthConfig.getTokenHeader());String authToken = null;if (strings != null && strings.size() > 0) {authToken = strings.get(0);}// 如果为空,则获取参数中的tokenif (StringUtils.isBlank(authToken)) {strings = request.getQueryParams().get("token");if (strings != null && strings.size() > 0) {authToken = strings.get(0);}}
// axios 拼接token
url.indexOf('?') === -1 ? config.url = url+'?_='+(new Date().getTime()) +"&token="+token: config.url = url+'&_='+(new Date().getTime())+"&token="+token;
替代方案2:
由于取请求头中token为配置项,后台只需修改配置即可,前台需要添加自定义请求头
public class UserAuthConfig {@Value("${auth.user.token-header}")private String tokenHeader;public String getTokenHeader() {return tokenHeader;}}
auth:serviceId: wsd-auth-serveruser:token-header: Custom-Token
axios.interceptors.request.use(config => {if (sessionStorage.getItem('token')) {// 自定义请求头config.headers['Custom-Token'] = sessionStorage.getItem('token');if(!config || !config.headers || !config.headers['Content-Type']){config.headers['Content-Type'] = 'application/json';}}let url=config.url.trim();url.indexOf('?') === -1 ? config.url = url+'?_='+(new Date().getTime()) : config.url = url+'&_='+(new Date().getTime());return config;
});