背景
最近跟着大神学习撸spring cloud,最后的章节是spring oauth2 保护应用程序的内容,跟着作者讲解找搬demo,但是我使用postman 访问http://localhost:5000/oauth/token 端口获取token时一直不成功,作者的版本比较老(貌似spring boot 是1.5,我的都是最新的稳定版2.x),主要是以下两个错误:
- 错误一
访问 http://localhost:5000/oauth/token 这个端口时报401 authentication is required, 这时候有两种解决方案,
第一种改代码(未验证): 参考:https://blog.csdn.net/u012040869/article/details/80140515
第二种该请求,即Postman 改成支持basic auth 的方式:
请求参数如下:
上面改完后401 的错误没了,怀着激动心情在PostMan 上点 “Send”,然后返回一大推错误,卧槽,一万只草泥马,但是还是的看错误:
There is no PasswordEncoder mapped for the id “null”
..........
不怕,有百度神器,去找一下解决方案:如下:
https://blog.csdn.net/canon_in_d_major/article/details/79675033
看着这老哥的文章我对比下我的代码,发现我已经设置了PasswordEncoder,我的代码如下如下:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userServiceDetail).passwordEncoder(new BCryptPasswordEncoder());
}
所以我的问题和他并不相同,于是只有调试代码了,首先看PasswordEncoder是否设置,发现设置了,然后看它认证的密码,发现
这里在抽出密码的ID,但是传入的密码是 “123456” 这个密码明显就是我在内容设置的某个client的secret ,按照代码的意思是它期望传入的是某个PasswordEncoder加密后的密码,并且带加密ID的那种,因此需要修改配置客户端的代码:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("user-service")
.secret("{bcrypt}"+encoder.encode("123456"))
.scopes("service")
.authorizedGrantTypes("refresh_token", "password")
.accessTokenValiditySeconds(3600);
}
这里方式是把secret 加密后放入内存并且加上{bcrypt} 这个加密方式的ID,然后再次获取token,一切正常了
思考
总感觉这种处理方式很奇怪,是不是有更好的方式,比如加密后返回当前加密方式和密码组合好的字符串,而不是我去拼接。