生成OAuth令牌时命中范围字符限制

时间:2017-03-10 12:16:31

标签: oauth-2.0 wso2 wso2-am scopes

我们正在使用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个字符的限制似乎相当具体!

由于

1 个答案:

答案 0 :(得分:0)

这是InnoDB prefix limit

如果您的MySQL版本> = 5.7.7,您可以直接增加列的大小。如果不是,您必须在增加之前设置innodb_large_prefix值。

请参阅https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix