Metrics
0
Watch 355 Star 1.1K Fork 557

li.shengzhao / spring-oauth-serverJavaGPL-2.0

oauth_access_token表出现一个UserName有多条数据 抛出incorrect result size:expected 1,actual 2

Closed
jason34  Created at

同一时间创建了2个token

这样就再登陆就会抛出:incorrect result size:expected 1,actual 2。
当时的环境只有一个APP USER在连接。是内部测试。

这个BUG很严重。

version:0.4-beta

7238_mkk total 5 participants

Comments (17)

7238_mkk
monkeyk7 2016-09-06 22:13 member

能提供具体的重显步骤吗?还有试试0.5版本呢

kleen 2017-07-10 14:11

问题重现

kleen 2017-07-10 14:13

步骤一 使用 password 类型登录
步骤二 刷新 refresh_token token ;
步骤三 再次使用步骤一登录; 此时数据库产生两条记录,此步骤可以重复

7238_mkk
monkeyk7 2017-07-10 14:26 member

嗯, 尽快检查修复

7238_mkk
monkeyk7 2017-07-10 19:49 member

@kleen 按照你提供的步骤, 我在本地无法重现你出现的问题, 你能再想想有什么原因

yhaili 2017-12-13 09:53

@monkeyk7 最近我这边也出现了这个问题,从日志中看到,同一时刻有两个相同的登陆请求,导致的生成两条token记录。我本地也验证了一下:
1、登陆代码中打断点阻塞一下请求
2、发送一条登陆请求
3、再重复发送一条登陆请求
4、断点去除全部放行
token记录中确实会出现两条authentication_id一样的记录

7238_mkk
monkeyk7 2017-12-13 10:04 member

@yhaili 打断点去测试真没办法解决.需要正常的执行流程.
不过这问题值得沉思下.同一时刻同一用户多次登录不太常见

yhaili 2017-12-13 10:17

@monkeyk7 断点测试只是为了重现同一时刻两次登陆请求的情况,是为了验证是这个问题造成的多条token数据。现在我们生产环境中确实出现了同一时候2条登陆请求的情况,具体为什么会发出两条登陆请求,目前还在调查中

7238_mkk
monkeyk7 2017-12-13 11:44 member

@yhaili 我能想到的在高并发情况下有可能会出现,但只是猜想, 一直未找到必然重现此问题的步骤; 也有可能是事务引起, 但数据库事务默认是 读已提交; 事务可能是一个原因;
我会继续跟踪,排查, 最终解决

yhaili 2017-12-13 15:38

我看了下创建token的源码,这里在并发的情况下本身就有问题
输入图片说明
输入图片说明

7238_mkk
monkeyk7 2017-12-14 14:01 member

看代码很容易看懂, 但问题时如何复现, 高并发时,就有一个账号同时操作./这也不一定

7238_mkk
monkeyk7 2018-09-29 12:32 member

这类问题在于 用同一个 client 同时去请求多次 access_token ; 第一个请求还没处理完,第二个相同请求已经到达 服务器,去查询 第一个请求的 AccessToken没查找 到就会出现这类情况;

这 在实际 使用中不适合,一个 client的同一用户 同时只能去请求一次即解决问题(不能一client并发去请求access_token);并且对获取 的 access_token 进行缓存(当要当期前再去请求新 access_token 或 调用 refresh token API)

feng_codes 2018-11-29 13:59

@yhaili @monkeyk7 我们现在也遇到了这种多token问题。 我有个思路,不知道行不行。重写生成token的代码,内容不变的情况下,使用synchronized 做同步处理。这样行不行?

7238_mkk
monkeyk7 2018-11-29 18:27 member

@feng_codes sync 肯定 是不推荐的;只需要一个client的用户不并发请求就没这问题。

7238_mkk
monkeyk7 2018-11-29 18:32 member

我会去检查 下新版本中修复这问题没。如果解决了会升级下版本。

feng_codes 2018-12-04 09:48

@monkeyk7 感谢

7238_mkk
monkeyk7 2019-08-28 18:25 member

在数据库中通过增加SQL字段 的唯一性来解决高并发下问题,SQL
ALTER TABLE oauth_access_token ADD UNIQUE INDEX authentication_id_unique_index(authentication_id);

另外在高并发场景下,推荐将 access_token 存入redis, 可参考文章:
http://andaily.com/blog/?p=19776

Sign in and comment

Assignee
Labels
Not set
Project
Milestone
Branch
Scheduled start
Not set
Scheduled end
Not set
Top level
Priority

Help Search