笔者最近在给自己的分布式项目添加授权登陆模块的时候碰到了一个问题,就是调用密码登陆服务(/oauth/token)的时候报400的错误,起初以为是入参字段写错了或少写了,后面才发现并不是这样,而是scope这个入参数的隐藏属性导致的,下面记录下笔者碰到的问题、解决思路、和解决办法
一、碰到的问题
2021-07-02 10:51:02.821 [http-nio-8877-exec-1] ERROR c.m.u.service.impl.LoginServiceImpl - [TID:dce9a7a6605645669b1727bb0d6b8ff5.118.16251942566390001] - 用户:muyichen,登陆异常:{
}
org.springframework.web.client.HttpClientErrorException$BadRequest: 400 null
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$UOFkryug(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.handleResponse$original$UOFkryug$accessor$JA7AeVwq(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$FcdkGx0t.call(Unknown Source)
二、解决思路
- 1、检查错误日志
看到上面面的日志后,果断选择了pass,日志中并没有给出什么能解决问题的错误信息;- 2、尝试用postman直接请求该地址
果然,代码中无法转译的错误信息,使用postman请求时一目了然,错误如下:
{
"error": "invalid_scope",
"error_description": "Invalid scope: all",
"scope": "read write"
}
三、解决办法
将原scope参数中的all入参值改为:read、write或者read write
以空格隔开的参数,oauth会将起读取成两个参数,如下图:
四、总结
- 1、如将client_id和client_secret两个参数放在请求体或者url中,oauth2的scope取值范围只有all,如下图:
- 2、如将client_id和client_secret两个参数放在请求头中,oauth2的scope取值范围会变成:read、write,如下图