当前位置: 首页 > 知识库问答 >
问题:

两个不同的断言字符串如何在WSO2身份服务器中生成相同的访问令牌?

彭朝
2023-03-14

我已经使用SAML扩展授权类型生成了访问令牌,如以下链接中所述:

https://docs.wso2.com/display/AM180/TokenAPI#TokenAPI-交换SAML2bearer的令牌与OAuth2(SAML的扩展granttype)

步骤1:生成断言字符串。

java -jar SAML2AssertionCreator.jar TestSP admin https://localhost:9443/oauth2/token https://localhost:9443/oauth2/token/home/dinusha/nothing/WSO2/API-Manager/saml-oauth/wso2is-5.0.0/rhbepository/resources/security/wso2carbon.jks wso2carbon wso2carbon wso2carbon

这给了我断言字符串。我已将到期时间设置为300 (5分钟)。

步骤2:获取访问令牌使用断言字符串和(consumerKey:ConsumerSecret)的Base64编码字符串,我可以生成Oauth访问令牌。

curl -k -d "grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer&assertion=<ASSERTION_PROVIDED_BY_CLIENT>&scope=PRODUCTION" -H "Authorization: Basic <ASSERTION_PROVIDED_BY_CLIENT>, Content-Type: application/x-www-form-urlencoded" https://localhost:9443/oauth2/token

生成Oauth访问令牌和刷新令牌。访问令牌的有效期为3600(60分钟)。

现在,假设用户的会话在5分钟的持续时间内超时(断言字符串到期时间),并且用户执行登录操作,则生成一个新的断言字符串,并删除现有的访问令牌。然而,这个新的断言字符串为我提供了与上一个会话中获得的相同的访问令牌。由于访问令牌已经无效,它尝试使用刷新令牌重新生成新的访问令牌。在这一步,我得到一个错误:“无效的刷新令牌”。(以下提供了日志)。我不认为这是刷新令牌的真实性的问题,因为应该使用新的断言字符串第二次生成一对新的访问令牌。

TID:[-1234][][2019-09-24 12:59:02,036]DEBUG { org . WSO 2 . carbon . identity . oauth 2 . util . oauth 2 util }-向thread local { org . WSO 2 . carbon . identity . oauth 2 . util . oauth 2 util }添加了OAuthTokenReqMessageContext

    at org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler.validatePersistedAccessToken(RefreshGrantHandler.java:251)
    at org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler.validateGrant(RefreshGrantHandler.java:79)
    at org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer.issue(AccessTokenIssuer.java:226)
    at org.wso2.carbon.identity.oauth2.OAuth2Service.issueAccessToken(OAuth2Service.java:225)
    at org.wso2.carbon.identity.oauth.endpoint.token.OAuth2TokenEndpoint.issueAccessToken(OAuth2TokenEndpoint.java:300)
    at org.wso2.carbon.identity.oauth.endpoint.token.OAuth2TokenEndpoint.issueAccessToken(OAuth2TokenEndpoint.java:90)
    at sun.reflect.GeneratedMethodAccessor153.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:188)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:104)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:204)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:249)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:289)
   at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:209)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:265)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.html" target="_blank">websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.wso2.carbon.webapp.mgt.filter.AuthorizationHeaderFilter.doFilter(AuthorizationHeaderFilter.java:128)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.wso2.carbon.ui.filters.cache.ContentTypeBasedCachePreventionFilter.doFilter(ContentTypeBasedCachePreventionFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:124)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.wso2.carbon.identity.context.rewrite.valve.TenantContextRewriteValve.invoke(TenantContextRewriteValve.java:80)
    at org.wso2.carbon.identity.authz.valve.AuthorizationValve.invoke(AuthorizationValve.java:91)
    at org.wso2.carbon.identity.auth.valve.AuthenticationValve.invoke(AuthenticationValve.java:65)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:99)
    at org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47)
    at org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:57)
    at org.wso2.carbon.event.receiver.core.internal.tenantmgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:48)
    at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:62)
    at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:159)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:57)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

TID:[-1234][][2019-09-24 12:59:09,090]DEBUG{org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer}-客户端ID提供的无效授予:

总而言之,我的问题是两个断言字符串(只要第一个仍然有效)给了我相同的访问和刷新令牌对。任何帮助都非常感谢。感谢阅读:)

共有1个答案

施俊哲
2023-03-14

这是预期的行为。由于您正在使用相同的(用户、客户端id和作用域)集进行身份验证,如果数据库中已存在请求的(用户,客户端id和范围)集的活动访问令牌,则它将返回上一个令牌。

如果您需要为每个令牌请求生成新的访问令牌,您必须从identity.xml.启用RenewTokenPer请求[1],但此配置仅在最新版本中可用(WSO2 IS 5.8.0 GA、WSO2 IS 5.7.0 WUM、WSO2 APIM 2.6.0 WUM)

否则,您可以使用自包含的访问令牌[2]。它将根据设计为每个请求发出新令牌。

另一种选择是通过扩展OauthTokenIssuerImpl类并重写renewAccessTokenPerRequest()方法来编写自定义OAuthTokenGenerator [3]以始终返回true。

[1] 每个请求 https://docs.wso2.com/display/IS580/Issuing 个新令牌

https://docs.wso2.com/display/IS540/Self-contained访问令牌

OAuth的https://docs.wso2.com/display/IS570/Extension点# ExtensionPointsforOAuth-OAuthTokenGenerator

 类似资料:
  • 例如,我有两个心率监视器与我的平板电脑配对。我正在使用这样的代码来获取HRM设备列表: 然后,我在GUI中显示一个列表框,其中包含从设备[I]获取的设备名称。名称例如,我选择索引为0的设备。然后我可以访问it人力资源服务和人力资源管理特征: 除了心率,我还需要电池状态。如何访问同一(已选择)设备的电池服务?

  • 问题内容: 我有两个字符串,它们看起来都一样: 但是,检查相等性表明它们不是。 我还尝试从命令提示符中复制两个字符串,并将它们作为新变量粘贴回去,但是它们仍然不相等。我有80%的把握是因为它们的编码方式很怪异,插入了一些我看不见的奇数字符,但是使用type()都只是显示为字符串。 有什么办法可以看到“真实”字符串?任何帮助表示赞赏。 问题答案: 他们是不一样的; using显示了这两个值之间的差异

  • 我的情况是这样,在 host H 上, 有 docker-compose.yml A 有 docker-compose.yml B 在 host A 上,curl localhost:801 可以访问。 但是进入 docker-compose.yml B 的 容器 nginx,curl host.docker.internal:801 缺无法访问,如何做到可以呢?

  • 问题内容: 为什么以下语句返回? 我也尝试过在字符串周围使用单引号。我唯一可以评估的方法是使用运算符,而不是 我的猜测是PHP将它视为某种方程式,但似乎有些奇怪。 有人可以详细说明吗? 问题答案: 是float数字格式,因此它们在比较时将转换为数字。 并且都将是因为它们太小。 对于在php中, 如果将数字与字符串进行比较,或者比较涉及 数字字符串 ,则每个字符串将转换为 数字 ,然后以数字方式进行

  • 我一直在试图解决这个面试问题,它要求洗牌字符串,以便没有两个相邻的字母是相同的,例如, ABCC->ACBC 我想到的方法是 1)遍历输入字符串并将(字母、频率)对存储在某个集合中 2)现在通过拉取频率最高(即>0)的字母来构建一个结果字符串 3)每当我们拉一封信时,更新(减少)频率 4)如果所有字母的频率为零,则返回结果字符串 5)如果只剩下一个频率大于1的字母,则返回错误 我假设是Unicod

  • 问题内容: 用Java编写的现有系统将字符串的哈希码用作其负载平衡的路由策略。 现在,我 无法修改系统, 但需要生成共享相同哈希码的字符串以测试最坏的情况。 我从命令行提供了这些字符串,并希望系统将所有这些字符串路由到同一目的地。 是否可以生成大量共享相同哈希码的字符串? 为了使这个问题更清楚: 备注:任何hashCode值都是可接受的。字符串是什么没有限制。但是它们应该彼此不同。 编辑:Stri