我们正在使用WS02 1.90,并且在范围值上遇到了字符长度限制的问题,该范围值可以针对幕后生成的标记进行分配。
例如,我们在Publisher中配置的60个API端点中添加了39个作用域。
某些单独的作用域名称可以长达50个字符,例如:
customer-order-authorisation-requests_create无论如何,在为给定用户生成令牌之后,当我们试图访问一个API时,我们从WSO2得到一个错误,告诉我们访问令牌对于所请求的资源是无效的。我们仔细检查了在令牌请求中发送的作用域值和返回的作用域值,并且可以看到错误消息中引用的相关资源的匹配作用域值。
在进一步挖掘WSO2日志之后,我们发现了以下内容:
2017-03-09 10:43:58,845 [-] [pool-46-thread-100] ERROR TokenPersistenceTask Error occurred while persisting access token 60efd3d6b9112d453c451d2965a753e1
org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception: Invalid request
at org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:196)
at org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.persistAccessToken(TokenMgtDAO.java:229)
at org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask.run(TokenPersistenceTask.java:56)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'TOKEN_SCOPE' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3868)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2470)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2617)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2550)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1192)
at org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:188)
... 5 more查看API Manager的数据库架构,TOKEN_SCOPE列位于表IDN_OAUTH2_ACCESS_TOKEN中,其定义如下:
CREATE TABLE IDN_OAUTH2_ACCESS_TOKEN (
ACCESS_TOKEN VARCHAR(255),
REFRESH_TOKEN VARCHAR(255),
CONSUMER_KEY VARCHAR(255),
AUTHZ_USER VARCHAR(100),
USER_TYPE VARCHAR (25),
TIME_CREATED TIMESTAMP DEFAULT 0,
VALIDITY_PERIOD BIGINT,
TOKEN_SCOPE VARCHAR(767),
TOKEN_STATE VARCHAR(25) DEFAULT 'ACTIVE',
TOKEN_STATE_ID VARCHAR (255) DEFAULT 'NONE',
PRIMARY KEY (ACCESS_TOKEN),
FOREIGN KEY (CONSUMER_KEY) REFERENCES IDN_OAUTH_CONSUMER_APPS(CONSUMER_KEY) ON DELETE CASCADE,
CONSTRAINT CON_APP_KEY UNIQUE (CONSUMER_KEY, AUTHZ_USER,USER_TYPE,TOKEN_STATE,TOKEN_STATE_ID,TOKEN_SCOPE)
)ENGINE INNODB;TOKEN_SCOPE字段有767个字符的限制。
因此,为了进一步测试这一点,我们开始删除在Publisher中的API中添加的作用域的数量,直到令牌API在令牌请求响应中返回的作用域字段的值低于此限制。
这允许我们再次开始访问API,而不会抛出任何错误。
这对我们来说是一个问题,因为我们只有大约三分之一的API受到作用域的保护。
我们当然可以为我们的作用域提出排序命名约定,但我们不想牺牲这些作用域的可读性,因为我们在应用程序中使用它们来确定登录用户的权限集。
在Publisher中创建和分配作用域时,WSO2似乎没有任何限制。
我们应该以其他方式使用作用域吗?767个字符的限制似乎相当具体!
谢谢
发布于 2017-03-20 23:17:42
如果您的MySQL版本是>= 5.7.7,则可以直接增加列的大小。如果不是,你必须在增加之前设置innodb_large_prefix的值。
请参阅https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix
https://stackoverflow.com/questions/42718245
复制相似问题