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.<init>(OAuthRequest.java:52)
	at org.apache.oltu.oauth2.as.request.AbstractOAuthTokenRequest.<init>(AbstractOAuthTokenRequest.java:34)
	at org.apache.oltu.oauth2.as.request.OAuthTokenRequest.<init>(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中正确使用方法:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天使马克

写博客不易,客观打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值