解决springcloud oauth2 401问题 外加源码解析

我在整合oauth2的时候遇到了401问题(在获取access_token的时候)

解决springcloud oauth2 401问题 外加源码解析_第1张图片

当时传递的参数是这样的,

后来报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行

解决springcloud oauth2 401问题 外加源码解析_第2张图片

this.clientCredentialsTokenEndpointFilter(http);这个方法的作用是重新形成授权信息,以form形式提交

你可能感兴趣的:(java初学,java)