首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成OAuth标记时达到作用域字符限制

生成OAuth标记时达到作用域字符限制
EN

Stack Overflow用户
提问于 2017-03-10 20:16:31
回答 1查看 716关注 0票数 1

我们正在使用WS02 1.90,并且在范围值上遇到了字符长度限制的问题,该范围值可以针对幕后生成的标记进行分配。

例如,我们在Publisher中配置的60个API端点中添加了39个作用域。

某些单独的作用域名称可以长达50个字符,例如:

代码语言:javascript
复制
customer-order-authorisation-requests_create

无论如何,在为给定用户生成令牌之后,当我们试图访问一个API时,我们从WSO2得到一个错误,告诉我们访问令牌对于所请求的资源是无效的。我们仔细检查了在令牌请求中发送的作用域值和返回的作用域值,并且可以看到错误消息中引用的相关资源的匹配作用域值。

在进一步挖掘WSO2日志之后,我们发现了以下内容:

代码语言:javascript
复制
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中,其定义如下:

代码语言:javascript
复制
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个字符的限制似乎相当具体!

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-03-20 23:17:42

这是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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42718245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档