无法从WSO2 IS 5.0.0发行有效的访问令牌

Mar*_*nov 5 wso2 wso2carbon wso2is

我正在运行WSO2 IS 5.0.0。我将IS 5.0.0的SP以及为该版本的Identity Server和Carbon 4.2.0发行的所有其他安全补丁一起应用了。我的环境由4台正在创建集群的计算机组成(使用WKA成员身份方案和带有粘性会话的Load Balancer)。我正在使用MySQL(不是默认的H2数据库)。部署IS的计算机是Windows Server 2012 R2(EC2 AWS计算机)。PRODUCT_HOME / repository / conf / identity.xml具有以下配置:

    <JDBCPersistenceManager>
    <DataSource>
        <Name>jdbc/WSO2CarbonDB</Name>
    </DataSource>
    <SessionDataPersist>
        <Enable>true</Enable>
        <RememberMePeriod>20060</RememberMePeriod>
        <CleanUp>
            <Enable>true</Enable>
            <Period>1440</Period>
            <TimeOut>20160</TimeOut>
        </CleanUp>
        <Temporary>false</Temporary>
    </SessionDataPersist>
</JDBCPersistenceManager>
<SessionContextCache>
    <Enable>true</Enable>
    <Capacity>100000</Capacity>
</SessionContextCache>
<OAuth>
    <AuthorizationCodeDefaultValidityPeriod>300</AuthorizationCodeDefaultValidityPeriod>
    <AccessTokenDefaultValidityPeriod>1800</AccessTokenDefaultValidityPeriod>
    <UserAccessTokenDefaultValidityPeriod>1800</UserAccessTokenDefaultValidityPeriod>
    <RefreshTokenValidityPeriod>31540000</RefreshTokenValidityPeriod>
    <TimestampSkew>10</TimestampSkew>
    <EnableOAuthCache>false</EnableOAuthCache>
    <RenewRefreshTokenForRefreshGrant>true</RenewRefreshTokenForRefreshGrant>
</OAuth>
Run Code Online (Sandbox Code Playgroud)

有时,我在Identity Server控制台日志中收到以下错误(使用client_credentials授予类型和openid范围颁发访问令牌时):

ERROR {org.wso2.carbon.identity.openidconnect.DefaultIDTokenBuilder} -  Error occurred while getting access token based information
ERROR {org.wso2.carbon.identity.oauth2.OAuth2Service} -  Error when issuing the access token.
    org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception: Error occurred while getting access token based information
    at org.wso2.carbon.identity.openidconnect.DefaultIDTokenBuilder.getAccessTokenIssuedTime(DefaultIDTokenBuilder.java:348)
    at org.wso2.carbon.identity.openidconnect.DefaultIDTokenBuilder.buildIDToken(DefaultIDTokenBuilder.java:141)
    at org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer.issue(AccessTokenIssuer.java:212)
    at org.wso2.carbon.identity.oauth2.OAuth2Service.issueAccessToken(OAuth2Service.java:177)
    at org.wso2.carbon.identity.oauth.endpoint.token.OAuth2TokenEndpoint.getAccessToken(OAuth2TokenEndpoint.java:233)
    at org.wso2.carbon.identity.oauth.endpoint.token.OAuth2TokenEndpoint.issueAccessToken(OAuth2TokenEndpoint.java:108)
    at sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:194)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:159)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178)
    at org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47)
    at org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:56)
    at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141)
    at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:156)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:52)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1653)
    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)
Run Code Online (Sandbox Code Playgroud)

我仍在尝试找出导致系统以这种方式运行的确切情况。在Identity Server控制台日志中记录此特定错误时,我在http_access日志(PRODUCT_HOME / repository / logs / http_access_DATE.log)中得到以下内容

172.31.26.60 - - [09/Sep/2016:07:18:28 +0000] "POST /oauth2/token?grant_type=client_credentials&scope=openid HTTP/1.1" 400 82 "-" "-"
Run Code Online (Sandbox Code Playgroud)

作为最终结果,我收到以下答复:

error: "server_error"
error_description: "Error when issuing the access token"
Run Code Online (Sandbox Code Playgroud)

我尝试通过将EnableOAuthCache设置为TRUE更新PRODUCT_HOME / repository / conf / identity.xml文件:

<EnableOAuthCache>true</EnableOAuthCache>
Run Code Online (Sandbox Code Playgroud)

然后,我重新启动了所有Identity Server实例(如前所述,WKA群集中有4台计算机)。一切进展顺利,直到有一天我们开始收到无效的访问令牌。
在深入研究这个特定问题之后,我发现由于某种原因,Identity Server返回了两个访问令牌。一个有效,另一个无效。我仍然使用完全相同的POST请求来检索具有client_credentials授予类型的访问令牌。通常,在发出访问令牌后,我正在对userinfo端点执行get请求,结果证明只有一个访问令牌是有效的。
上面提到的也是随机发生的。通常在10到15分钟后,无效令牌将不再返回并且系统稳定。遇到问题时,将在Identity Server控制台日志中记录以下内容:

ERROR{org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask} -  org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception: Error when getting an Identity Persistence Store instance.
Run Code Online (Sandbox Code Playgroud)

没有其他信息或堆栈跟踪。
同样,返回的无效访问令牌在数据库中也不存在。
我的系统依靠这些访问令牌,并且当我无法检索这些令牌或检索无效令牌并且无法调用userinfo端点时,我遇到了停机。上次大约是15-20分钟。
所以我的问题是:
1.其他人是否观察到这种行为,或者这是已知问题?如果是这样,是否有解决方法或可以应用的某种补丁?
2.如果您不认为这可能是某种配置问题?如果是这样,您认为应该修改哪些配置文件?
3.您是否认为此行为可能与WKA群集配置有关?
4.您认为这可能与MySQL的使用有关吗?

感谢您的时间和考虑。

小智 0

最好使用identity server. 您可以前往WSO2 Identity Server 页面并下载最新版本。