Oauth2.0的客户端凭证模式(Client Credentials Grant)- Bad request content type. Expecting: application/x-www-

前情摘要:

        最近在进行项目改造由传统Java Web项目改造为 微服务架构模式的系统,采用VUE+Spring Boot + Oauth2.0 + JWT的主体架构。在改造过程中出现的任何异常在此做一个简单记录,以便正在路上的小伙伴们能有参照方案。

在写好一系列认证授权模块后,测试获取token时控制台报了一个很有意思的异常:

OAuthProblemException{error='invalid_request', description='Bad request content type. Expecting: application/x-www-form-urlencoded', uri='null', state='null', scope='null', redirectUri='null', responseStatus=0, parameters={}}

	at org.apache.oltu.oauth2.common.exception.OAuthProblemException.error(OAuthProblemException.java:59)
	at org.apache.oltu.oauth2.common.utils.OAuthUtils.handleOAuthProblemException(OAuthUtils.java:167)
	at org.apache.oltu.oauth2.common.utils.OAuthUtils.handleBadContentTypeException(OAuthUtils.java:191)
	at org.apache.oltu.oauth2.common.validators.AbstractValidator.validateContentType(AbstractValidator.java:60)
	at org.apache.oltu.oauth2.as.request.OAuthRequest.validate(OAuthRequest.java:62)
	at org.apache.oltu.oauth2.as.request.OAuthRequest.(OAuthRequest.java:52)
	at org.apache.oltu.oauth2.as.request.AbstractOAuthTokenRequest.(AbstractOAuthTokenRequest.java:34)
	at org.apache.oltu.oauth2.as.request.OAuthTokenRequest.(OAuthTokenRequest.java:53)

从异常本身来看就是请求方式错误,但对于经验不足的小伙伴可能就是一头雾水了。这里的请求方式不是指的GET 、POST之类。而是你发起这个请求的模式。本人是在用postman模拟时得到的这个异常,在用postman之前本人已经用正常方式测试了获取Token的方法是正常的,并能成功获得JWT的token信息,只是为了方便后面又用postman来模拟,然后记得到了此异常,一开始也明白具体问题在那里。

解答:其实真正的问题是在于用oauth2.0发起token请求时不是一个普通的request请求。在模拟获取token这个过程中不是直接用postman建一个request。在postman中有独立的Authorization入口,类似于在代码层面我们需要用OAuthClientRequest 通过buildQueryMessage的方式去构建一个request一样,携带的信息是在url中的,并非在header中。

请求token代码实现:

OAuthClientRequest accessTokenRequest = OAuthClientRequest
					.tokenLocation(tokenUrl)
			        .setGrantType(GrantType.CLIENT_CREDENTIALS)
			        .setClientId(clientId)
			        .setClientSecret(clientSecret)
			        .buildQueryMessage();
//去服务端请求access token,并返回响应
OAuthAccessTokenResponse oAuthResponse = oAuthClient.accessToken(accessTokenRequest, OAuth.HttpMethod.POST);
			

在POSTMAN中正确使用方法:

Oauth2.0的客户端凭证模式(Client Credentials Grant)- Bad request content type. Expecting: application/x-www-_第1张图片

你可能感兴趣的:(VUE,Oauth2.0)