我在整合oauth2的时候遇到了401问题(在获取access_token的时候)
当时传递的参数是这样的,
后来报401错误,提示信息Full authentication is required to access this resource
后来发现是oauth2内部机制决定的 里面有两种选择,
org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer中有一个
allowFormAuthenticationForClients变量 默认是false 需要设置为true 允许client使用form的方式进行authentication的授权
调用allowFormAuthenticationForClients()方法
原因:通过post方式向/oauth/token这个接口获取access_token的时候,会发现这个时候authentication用的并不是前面授权通过的那个authentication,而是使用的匿名登陆的那个authentication,这样前面的authentication就无法正常使用,也会因此而得到401 authentication is required。
然后在参数中加入 client_id client_secret
重新发送就ok了
成功的返回:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MzI1NDA1NzUsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiYWRtaW4iXSwianRpIjoiOThlYzcwMjEtYWRjNi00MzNmLWIzYjQtNzZkNTZkY2Q4ZDc1IiwiY2xpZW50X2lkIjoiY2xpZW50Iiwic2NvcGUiOlsiYXBwIl19.hrPqrqCMNWwZt6oiVTM8dY9AvD5l4SJL3Sn386-VQysf-oMUivGLliFR7x0qXJbgw1-0O0MysmUu5YDWKEdFCYCAJSBDqFyr3SNpCiKbVfLmGDDoDKRYHeIRSWknSCEIVJYhmNBIaPtf8_RNX6P1YcDYW5bEagf29abrniKFZ_A0AfhD5q7x5vx5gdNqIppDRwH0Ygq_RLww6XASQ4jzVkSo28a1-L58SFBiDTy7yo0aozfXxL3428f-GYgClu4EHatn-0P2Ah5BpDLe54RRNWtygwXNmW-8Q5zKdRBFP03wz5nPa7surP7qfid3pQlsq1C8I3DWyQKuCrWJgBxw6w",
"token_type": "bearer",
"expires_in": 43199,
"scope": "app",
"user_name": "admin",
"jti": "98ec7021-adc6-433f-b3b4-76d56dcd8d75"
}
问题解决之后:从源码的角度分析一下
AuthorizationServerSecurityConfigurer类中
146行
this.clientCredentialsTokenEndpointFilter(http);这个方法的作用是重新形成授权信息,以form形式提交