我正在使用外部 OpenID Connect IDP 测试 wso2 身份服务器。外部 IDP 是 GLUU。
在我的测试用例中,我有三个组件:
- 部署在 localhost:8099 上的简单 Web 应用程序
- 部署在 localhost:9443 上的 wso2 身份服务器(使用其默认端口)
- 部署在 localhost 上的 GLUU 服务器(使用其默认端口)
我要获取的流程是 OpenId Connect 授权码,我的“简单 Web 应用程序”(配置为 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、秘密、令牌和身份验证端点)的信息以及此 URL 回调:https://localhost:9443/commonauth
这是前提。
我第一次尝试这种情况,这是我得到的:
- 从我的“简单网络应用程序”调用 wso2is 授权端点
- 重定向到 GLUU 登录页面
- 回到我的“简单网络应用程序”回调 uri,其中包含错误而不是授权代码:{error_description=Authentication required, state=OX86oF, error=login_required, session_state=70b94648800ea5fa1e2476570ee9678225eaccc4deecea18ca9db022b7e1697c.fF2IdhJSG3aTE_TIsyGlYg}
与此错误相关的 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,客户端身份验证失败(例如 G。未知客户端、不包括客户端身份验证或不支持的身份验证方法)。授权服务器可以返回一个 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。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) 原因:OAuthProblemException{error='invalid_client', description='客户端身份验证失败(例如未知客户端、未包含客户端身份验证或不支持的身份验证方法)。授权服务器可以返回一个 HTTP 401(未授权)状态码来指示支持哪些 HTTP 认证方案。如果客户端尝试通过 Authorization 请求头字段进行身份验证,
在此错误之后,使用 GLUU 管理 UI,我将“令牌端点的身份验证方法”从 client_secret_basic 更改为 client_secret_post,然后我再次尝试测试,一切正常:
- 从我的“简单网络应用程序”调用 wso2is 授权端点。
- 重定向到 GLUU 登录页面
- 重定向到 WSO2IS 身份验证页面(OpenID 用户声明服务提供商测试应用程序请求访问您的个人资料信息......)
- 使用授权码返回我的“简单网络应用”回调 uri:{code=7269a75f-8702-3843-a553-465b69546a27, state=6yFD89, session_state=61d504abd9fe3cda28934f4aa394b156d6792071669f3020d4b79373bapyoc123
- 我的“简单网络应用”调用 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 的配置中进行哪些更改才能使这种情况正常工作?