繁体   English   中英

WSO2 API Manager身份验证违反UNIQUE KEY约束错误

[英]WSO2 API Manager authentication Violation of UNIQUE KEY constraint error

我们在分布式架构中实现WSO2 API管理器(v1.10.0)作为在线文档中列出这里

这包括以下内容(在5台单独的服务器上):

  • 网关(x2)
  • 发布者和商店(在单个服务器上)
  • 密钥管理器(x2)

这些已连接到SQL Server 2014实例上的3个常规API Manager数据库(注册表,用户管理器和API Manager)。

我们使用密钥管理器对网站用户进行身份验证(登录,忘记密码等),以及对API调用进行身份验证。

但是,当尝试登录该站点时,我在密钥管理器上看到以下(违反UNIQUE KEY约束)错误:

TID:[-1] [] [2016-10-06 00:36:47,842]错误{org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask}-持久保存访问令牌时发生错误:c5a0a11e63388dCHANGEDea34b0533445 {org.wso2。 carbon.identity.oauth2.dao.TokenPersistenceTask} org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception:将消费者密钥的访问令牌存储在org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.Access上的fpA6AhOfbVCHANGEDgH0WzBDOga时出错。 org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.persistAccessToken(TokenMgtDAO.java:284)处的org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask.run(TokenPersistenceTask.java: 52)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java) :745)由以下原因引起:com.microsoft.sqlserver.jdbc.SQLServerException:违反UNIQUE KEY约束'CON_APP_KEY'。 无法在对象'dbo.IDN_OAUTH2_ACCESS_TOKEN'中插入重复的密钥。 重复的键值为(15,williams.j2@CHANGED.org.uk,-1234,,APPLICATION_USER,369db21a386ae4CHANGED0ff34d35708d,ACTIVE,NONE)。 在com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement处com.microsoft.sqlserver.jdbc.SQLServerServermentment.getNextResult(SQLServerStatement.java:1515)处com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) (SQLServerPreparedStatement.java:404)在com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement $ PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)在com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)在com。 microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement。 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332)处的java.155)org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:224)处的... 另外5个

这导致网站上出现以下.NET错误:

wso2 dotnet错误

我已经尝试使用Google搜索,但是找不到最新答案。

我还没有配置的主要管理人员具有硕士和工作节点(如概述这里 )作为文件似乎表明,这是没有必要的。

任何帮助将不胜感激!

经过一些调试发现问题! 在我们放置此配置之前,

<JDBCPersistenceManager>
    <SessionDataPersist>
        <PoolSize>0</PoolSize>
    </SessionDataPersist>
</JDBCPersistenceManager>

APIM可以将多个活动OAUTH令牌保存到IDN_OAUTH2_ACCESS_TOKEN表中,以进行单个令牌获取调用。

当令牌验证端点查询令牌时,仅返回最后一个令牌(使用基于时间的排序和限制)。 当该令牌过期时,令牌验证将其标记为非活动状态。 但是上一个保持原样。

当刷新令牌发生时,它将检查最新令牌是否处于非活动状态。 由于它是非活动的,因此它将发出新令牌。 但是,当令牌端点尝试持久保存令牌时,会有另一个ACTIVE令牌。 这导致了此异常。

为了解决这个问题,我们可以在IDN_OAUTH2_ACCESS_TOKEN表上运行更新查询,以将所有ACTIVE令牌标记为INACTIVE。

update IDN_OAUTH2_ACCESS_TOKEN set TOKEN_STATE="INACTIVE" where TOKEN_STATE="ACTIVE"

然后,旧的错误令牌将被删除,服务器将开始正常运行!

我使用mysql并面临相同的问题。 更改池大小也不是一个完整的解决方案。 然后,我注意到关于idn_oauth2_access_token表的一些奇怪之处。 有一列time_created,但是内容不是创建时间。 这是最后一个更新时间戳。 我在time_created列中的几列上读取了系统命令。 我检查了我的sql脚本,并看到在触发更新时数据库更新了此列。 我删除了此规则,没有其他错误。

您可以在<APIM_HOME>/repository/conf/identity.xml更改以下配置( <PoolSize>0</PoolSize> )并查看吗? 默认情况下,PoolSize设置为100。

<JDBCPersistenceManager>
    <SessionDataPersist>
        <PoolSize>0</PoolSize>
    </SessionDataPersist>
</JDBCPersistenceManager>

希望这能解决您的问题。

参考: http : //sanjeewamalalgoda.blogspot.com/2015/08/how-to-a-void-getting-incorrect-access.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM