最近在学习通过OAuth搭建统一授权认证的服务甚是困扰,在通过/oauth/authorize
获取授权码的时候一切顺利,获取token:
### idea插件 发送POST请求,获取access_token
POST http://localhost:8081/oauth/token
Accept: */*
Cache-Control: no-cache
Content-Type: application/json;charset=UTF-8
{
"client_id": "client_id",
"client_secret": "client_secret",
"grant_type": "authorization_code",
"code": "HuhGGC",
"redirect_uri": "http://www.baidu.com"
}
然而总是报以下错误:
{
"timestamp": "2021-05-26T14:40:42.831+00:00",
"status": 401,
"error": "Unauthorized",
"message": "",
"path": "/oauth/token"
}
网上搜了解决方案,都是说client_id
和client_secret
两个参数没有给(没给这两个参数确实会报未授权),但是我的问题不是该原因导致的!
但是我们能从这个思路发现一些问题,会不会因为授权认证时确实没有给到参数。于是我在程序中写了一个过滤器,查看在进入授权认证之前查看请求的参数,发现确实没有参数
@Component
@Order(-1000)
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
// parameterMap是空的
Map<String, String[]> parameterMap = request.getParameterMap();
filterChain.doFilter(servletRequest, servletResponse);
}
}
相信不用多说了,POST请求发送数据的方式有多种,这种以application/json
请求体这种方式/oauth/token
是拿不到数据的
可以通过这种方式
###
POST http://localhost:8081/oauth/token?client_id=client_id&client_secret=client_secret&grant_type=authorization_code&code=BQJY0J&redirect_uri=http://www.baidu.com
Accept: */*
Cache-Control: no-cache