security+oauth2 在进行资源访问的时候报错401,无效的access_token错误

2 篇文章 0 订阅
2 篇文章 0 订阅

参考资料:不分先后
https://my.oschina.net/caidenpan/blog/2978811
https://www.cnblogs.com/hellxz/p/12044482.html
https://www.cnblogs.com/hellxz/p/12044482.html

首先,我大致说下我项目的背景:
是一个简单的springcloud项目,
采用的Eureka+zuul+fegin
认证授权采用的security+oauth2
spring-cloud版本Hoxton.SR6

采用的是授权码模式,前面如何获得code,再获得access_token我就不做过多赘述,网上很多这种单体demo。这里的重点是针对拿到access_token后,请求带着access_token去访问资源,还是出现401的情况。如下图

在这里插入图片描述
access_token已经存储在redis中去了,并且在有效时间内,但是在我们带着token过去,却说验证码无效。

由于本人也是第一次接触这个security+oauth2,仅看了些视频和网上查找相关资料,所以对这个机制也不是特别熟悉,只有个大致的了解。在认证服务器上,我们有配置一个tokenStore,是返回的***return new RedisTokenStore(redisConnectionFactory);***

如下图

在这里插入图片描述
这里是将我们生成的access_token等信息存入到redis中;存入到redis中如下:

在这里插入图片描述
也就是说,我们的redis里面有,但是又说无效,说明我们前端传过去的access_token(和redis中一致的)和框架取出来对比的不一致!我们能保证我们的没有问题,那么肯定是框架取出来的不正确!但是我们又找不到他框架是在哪里去取得这个,然后做的对比,通过百度,上面有链接,获知经过了这么一个类:DefaultTokenServices.java

在这里插入图片描述
可以下载源码下来看看

在这里插入图片描述
我们看下他下面有哪些方法什么的。

在第一次生成access_token时,我断点发现我和别人说的不一样,我这个地方也是redis的tokenstore!在这里插入图片描述
但是我在带着access_token的请求资源时,重点就来了。。。

在这里插入图片描述
这就变成内存的tokenstore了。。。。这下原因就清楚了,一个是内存获取access_token,一个是存在redis中的,内存里肯定没有,都是null,问题就在这里了。
那么我们只在认证服务器上配置了一个tokenstore,取得时候的这个tokenstore在哪里配置呢?查找资料发现就应该在资源处再配置一下tokenstore,和认证服务器上的保持一致,就OK了!如下图:

在这里插入图片描述
加上这一段之后,启动报错,无法注入RedisConnectionFactory。引入如下依赖解决!因
至此,再重启就可以访问到服务器的资源了!

在这里插入图片描述

有不同的可以下面评论,必回。
点个赞吧!
转载需注明出处哦!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
使用Spring Security OAuth2进行code换取access_token的步骤如下: 1.客户端向认证服务器发出授权请求,包括客户端ID、访问范围、重定向URI和response_type=code参数。 2.认证服务器对用户进行认证,如果用户认证通过,认证服务器将生成授权码(code)。 3.认证服务器将授权码(code)发送给客户端重定向URI中。 4.客户端收到授权码(code)后,使用code和client_secret向认证服务器请求access_token。 5.认证服务器验证code和client_secret,如果验证通过,将生成access_token。 6.客户端收到access_token后,即可使用该token访问受保护的资源。 示例代码如下: ``` RestTemplate restTemplate = new RestTemplate(); MultiValueMap<String, String> params= new LinkedMultiValueMap<>(); params.add("grant_type", "authorization_code"); params.add("code", code); params.add("redirect_uri", redirectUri); params.add("client_id", clientId); params.add("client_secret", clientSecret); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(tokenUrl, requestEntity, String.class); ``` 其中,code是授权码,redirectUri是客户端重定向URI,clientId和clientSecret是客户端ID和密钥,tokenUrl是认证服务器的地址。授权服务器将返回一个JSON格式的字符串,其中包含access_token等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值