【问题标题】:WSO2 Identity Server with external GLUU OpenId Connect IDP - Authentication method client_secret_basic vs client_secret_post具有外部 GLUU OpenId Connect IDP 的 WSO2 身份服务器 - 身份验证方法 client_secret_basic 与 client_secret_post
【发布时间】:2019-02-25 16:34:48
【问题描述】:

我正在使用外部 OpenID Connect IDP 测试 wso2 身份服务器。外部 IDP 是 GLUU。

在我的测试用例中,我有三个组件:

  • 一个部署在 localhost:8099 上的简单 Web 应用
  • 在 localhost:9443 上部署的 wso2 身份服务器(使用其默认端口)
  • 在 localhost 上部署的 GLUU 服务器(使用其默认端口)

我要获取的流程是一个 OpenId Connect 授权码,我的“简单网络应用”(配置为 wso2is 中的服务提供商)需要 wso2is 的代码,被重定向到 GLUU 登录页面,获取授权码并交换访问令牌的授权码。

“简单 Web 应用”在 wso2is 中注册为服务提供者(名称为“服务提供者测试”),入站身份验证配置类型为“OAuth/OpenId 连接配置”。在此配置中,我设置了“简单 Web 应用”的回调 URL,以及我的简单 Web 应用用于获取访问令牌的客户端密码和客户端 ID。

“本地和出站身份验证配置”部分中的此“服务提供商测试”设置为联合身份验证,使用“我的 Gluu 测试 IDP”。

我的 Gluu 测试 IDP 是我添加到 wso2is 的“服务提供者”的身份提供者的名称。我已将 Gluu 的证书上传到“我的 Gluu 测试 IDP”。

在“My Gluu Test IDP”的“Federated Authenticators”部分中,我设置了一个“OAuth/OpenId Connect Configuration”,其中包含 GLUU IDP(客户端 ID、秘密、令牌和身份验证端点)的信息,并使用此网址回调:https://localhost:9443/commonauth

这是前提。

我第一次尝试这种情况,这是我得到的:

  1. 从我的“简单网络应用”调用 wso2is 授权端点
  2. 重定向到 GLUU 登录页面
  3. 返回我的“简单 Web 应用”回调 uri 并显示错误而不是授权代码:{error_description=Authentication required, state=OX86oF, error=login_required, session_state=70b94648800ea5fa1e2476570ee9678225eaccc4deecea18ca9db022b7e1697c.fF2IdhJSG3aTE_TIsyGli}

与此错误相关的wso2is日志为:

TID:[-1234] [] [2018-09-21 10:33:10,529] 错误 {org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler} - invalid_client,客户端身份验证失败(例如未知客户端、未包含客户端身份验证或不支持的身份验证方法)。授权服务器可以返回一个 HTTP 401(未授权)状态码来指示支持哪些 HTTP 认证方案。如果客户端尝试通过 Authorization 请求头字段进行身份验证,授权服务器必须以 HTTP 401(未授权)状态代码进行响应,并包含与客户端使用的身份验证方案匹配的 WWW-Authenticate 响应头字段。 org.wso2.carbon.identity.application.authentication.framework.exception.AuthenticationFailedException:invalid_client,客户端身份验证失败(例如,未知客户端、未包含客户端身份验证或不支持的身份验证方法)。授权服务器可以返回一个 HTTP 401(未授权)状态码来指示支持哪些 HTTP 认证方案。如果客户端尝试通过 Authorization 请求头字段进行身份验证,授权服务器必须以 HTTP 401(未授权)状态代码进行响应,并包含与客户端使用的身份验证方案匹配的 WWW-Authenticate 响应头字段。 在 org.wso2.carbon.identity.application.authenticator.oidc.OpenIDConnectAuthenticator.getOauthResponse(OpenIDConnectAuthenticator.java:585) 在 org.wso2.carbon.identity.application.authenticator.oidc.OpenIDConnectAuthenticator.processAuthenticationResponse(OpenIDConnectAuthenticator.java:370) 在 org.wso2.carbon.identity.application.authentication.framework.AbstractApplicationAuthenticator.process(AbstractApplicationAuthenticator.java:72) 在 org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.doAuthentication(DefaultStepHandler.java:488) 在 org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.handleResponse(DefaultStepHandler.java:462) 在 org.wso2.carbon.identity.application.authentication.framework.handler.step.impl.DefaultStepHandler.handle(DefaultStepHandler.java:165) 在 org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handle(DefaultStepBasedSequenceHandler.java:176) 在 org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.GraphBasedSequenceHandler.handle(GraphBasedSequenceHandler.java:63) 在 org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultAuthenticationRequestHandler.handle(DefaultAuthenticationRequestHandler.java:131) 在 org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator.handle(DefaultRequestCoordinator.java:157) 在 org.wso2.carbon.identity.application.authentication.framework.servlet.CommonAuthenticationServlet.doPost(CommonAuthenticationServlet.java:53) 在 org.wso2.carbon.identity.application.authentication.framework.servlet.CommonAuthenticationServlet.doGet(CommonAuthenticationServlet.java:43) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:624) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 在 org.eclipse.equinox.http.helper.ContextPathServletAdaptor.service(ContextPathServletAdaptor.java:37) 在 org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) 在 org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128) 在 org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 在 org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service(DelegationServlet.java:68) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.wso2.carbon.identity.captcha.filter.CaptchaFilter.doFilter(CaptchaFilter.java:76) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.owasp.csrfguard.CsrfGuardFilter.doFilter(CsrfGuardFilter.java:72) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter.doFilter(CharacterSetFilter.java:65) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:124) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.wso2.carbon.identity.context.rewrite.valve.TenantContextRewriteValve.invoke(TenantContextRewriteValve.java:80) 在 org.wso2.carbon.identity.authz.valve.AuthorizationValve.invoke(AuthorizationValve.java:91) 在 org.wso2.carbon.identity.auth.valve.AuthenticationValve.invoke(AuthenticationValve.java:60) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:99) 在 org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47) 在 org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:57) 在 org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:62) 在 org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:159) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 在 org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:57) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748) 原因:OAuthProblemException{error='invalid_client', description='客户端身份验证失败(例如,未知客户端、未包含客户端身份验证或不支持的身份验证方法)。授权服务器可以返回一个 HTTP 401(未授权)状态码来指示支持哪些 HTTP 认证方案。如果客户端尝试通过 Authorization 请求头字段进行身份验证,则授权服务器必须以 HTTP 401(未授权)状态代码进行响应,并包含与客户端使用的身份验证方案匹配的 WWW-Authenticate 响应头字段。', uri= 'null',状态='null',范围='null',redirectUri='null',responseStatus=0,参数={}} 在 org.apache.oltu.oauth2.common.exception.OAuthProblemException.error(OAuthProblemException.java:59) 在 org.apache.oltu.oauth2.client.validator.OAuthClientValidator.validateErrorResponse(OAuthClientValidator.java:63) 在 org.apache.oltu.oauth2.client.validator.OAuthClientValidator.validate(OAuthClientValidator.java:48) 在 org.apache.oltu.oauth2.client.response.OAuthClientResponse.validate(OAuthClientResponse.java:64) 在 org.apache.oltu.oauth2.client.response.OAuthClientResponse.init(OAuthClientResponse.java:59) 在 org.apache.oltu.oauth2.client.response.OAuthAccessTokenResponse.init(OAuthAccessTokenResponse.java:52) 在 org.apache.oltu.oauth2.client.response.OAuthClientResponseFactory.createCustomResponse(OAuthClientResponseFactory.java:60) 在 org.apache.oltu.oauth2.client.URLConnectionClient.execute(URLConnectionClient.java:111) 在 org.apache.oltu.oauth2.client.OAuthClient.accessToken(OAuthClient.java:65) 在 org.apache.oltu.oauth2.client.OAuthClient.accessToken(OAuthClient.java:55) 在 org.apache.oltu.oauth2.client.OAuthClient.accessToken(OAuthClient.java:71) 在 org.wso2.carbon.identity.application.authenticator.oidc.OpenIDConnectAuthenticator.getOauthResponse(OpenIDConnectAuthenticator.java:580) ... 61 更多

出现此错误后,使用 GLUU 管理 UI,我将“令牌端点的身份验证方法”从 client_secret_basic 更改为 client_secret_post,然后我再次尝试测试,一切正常:

  1. 从我的“简单网络应用”调用 wso2is 授权端点。
  2. 重定向到 GLUU 登录页面
  3. 重定向到 WSO2IS 身份验证页面(OpenID 用户声明服务提供商测试应用程序请求访问您的个人资料信息...)
  4. 回到我的 “简单的web应用程序” 回调URI与授权码:{代码= 7269a75f-8702-3843-a553-465b69546a27,状态= 6yFD89,session_state = 61d504abd9fe3cda28934f4aa394b156d6792071669f3020d4b79373ba5a1236.-QhpECv8pyocY1T2uu-KBQ} LI>
  5. 我的“简单网络应用”调用wso2is授权端点,传递代码,获取accecc_token

最后是我的问题:

在这个测试场景中,我可以更改外部 IDP 的配置,但在实际场景中,我无法更改外部 IDP 上的该参数。我在 WSO2IS 身份提供程序配置中找不到如何从 client_secret_basic、client_secret_post、client_secret_jwt、private_key_jwt、none 中进行选择。

在不将 GLUU IDP 设置从 client_secret_basic 更改为 client_secret_post 的情况下,我应该在 wso2is 的配置中进行哪些更改才能使此方案正常工作?

【问题讨论】:

    标签: wso2 wso2is gluu


    【解决方案1】:

    从 IS 5.6.0 开始,您可以选择配置客户端身份验证机制。在 IdP 设置的“OAuth2/OpenID 连接配置”中,您可以使用“Enable HTTP basic auth for client authentication”属性来实现您的要求。

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2018-07-01
      • 1970-01-01
      相关资源
      最近更新 更多