具有外部GLUU OpenId Connect IDP的WSO2 Identity Server-身份验证方法client_secret_basic与client_secret_post

时间:2018-09-21 09:36:52

标签: wso2 wso2is gluu

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

在我的测试案例中,我包含三个组成部分:

  • 部署在localhost:8099上的简单Web应用程序
  • 部署在localhost:9443上的wso2 Identity Server(具有其默认端口)
  • 在本地主机上部署的GLUU服务器(具有默认端口)

我要获取的流程是一个OpenId Connect授权代码,我的“简单Web应用程序”(类似于wso2is中的服务提供商进行配置)需要将代码写入wso2is,重定向到GLUU登录页面,获取授权代码并进行交换访问令牌的授权代码。

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

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

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

在“我的Gluu测试IDP”的“联合身份验证器”部分中,我使用GLUU IDP的信息(客户端ID,机密,令牌和身份验证端点)设置了“ OAuth / OpenId Connect配置”网址回调:https://localhost:9443/commonauth

这是前提。

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

  1. 从我的“简单的Web应用程序”调用wso2is授权端点
  2. 重定向到GLUU登录页面
  3. 返回我的“简单Web应用”回调uri,但出现错误而不是授权码:{error_description =需要身份验证,state = OX86oF,error = login_required,session_state = 70b94648800ea5fa1e2476570ee9678225eaccc4deecea18ca9db022b7e1697c.fF2IdhJSGli>

与此错误相关的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认证方案。如果客户端尝试通过授权请求头字段进行身份验证,则授权服务器务必使用HTTP 401(未授权)状态码进行响应,并包括与客户端使用的身份验证方案匹配的WWW-Authenticate响应头字段。   org.wso2.carbon.identity.application.authentication.framework.exception.AuthenticationFailedException:invalid_client,客户端身份验证失败(例如,未知客户端,不包括客户端身份验证或不支持的身份验证方法)。授权服务器可以返回HTTP 401(未授权)状态码,以指示支持哪些HTTP认证方案。如果客户端尝试通过授权请求头字段进行身份验证,则授权服务器务必使用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认证方案。如果客户端尝试通过授权请求标头字段进行身份验证,则授权服务器务必使用HTTP 401(未授权)状态码进行响应,并包括与客户端使用的身份验证方案相匹配的WWW-Authenticate响应标头字段。 'null',state ='null',scope ='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. 从我的“简单的Web应用程序”调用wso2是授权端点。
  2. 重定向到GLUU登录页面
  3. 重定向到WSO2IS身份验证页面(OpenID用户声明服务提供商测试应用程序请求访问您的个人资料信息...)
  4. 使用授权码返回我的“简单Web应用”回调uri:{code = 7269a75f-8702-3843-a553-465b69546a27,state = 6yFD89,session_state = 61d504abd9fe3cda28934f4aa394b156d6792071669f3020d4b79373ba5a1236.-QQECB2>
  5. 我的“简单的Web应用”调用wso2is授权端点,传递代码,并获取accecc_token

最后是我的问题:

在此测试方案中,我可以更改外部IDP的配置,但是在实际方案中,我无法在外部IDP上更改该参数。我在WSO2IS身份提供程序配置中找不到如何从client_secret_basic,client_secret_post,client_secret_jwt,private_key_jwt,无选择中选择。

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

1 个答案:

答案 0 :(得分:1)

从IS 5.6.0起,您可以选择配置客户端身份验证机制。在IdP设置的“ OAuth2 / OpenID Connect配置”中,可以使用“ 为客户端身份验证启用HTTP基本身份验证”属性来满足您的要求。