所以这里是问题的简短描述:在作为 SP 的 Okta(OIDC) 和作为 IDP 的另一个 Okta/客户端 (Saml2) 之间进行反应身份验证。
我们已将 SP (Okta) 和另一个 Okta 之间的 IDP 集成配置为 (IDP)
据我了解的预期行为:
- 我们的 Okta 使用 IDP 进行身份验证,它应该在双方(SP 和 IDP)上创建用户 cookie,这样我就可以使用 cookie 进行身份验证。
当前行为:我们正在使用 saml2 流成功地对 IDP 进行身份验证,我查看了双方的系统日志。但是永远不会创建 cookie。
请注意,在使用 IDP 对用户进行身份验证后发生:如果我导航到 IDP okta ( https://dev-idp.okta.com ),它将回复重定向到此 url ( https://dev-idp.okta .com/app/UserHome?iss=https%3A%2F%2Fdev-idp.okta.com&login_hint=malsoud%test-saml.com)然后它将仅为 IDP 组织创建 cookie。但不是 SP Okta 组织。
注意:第 3 方 cookie 也已启用。
更多细节:
我有一个反应应用程序,该应用程序当前配置了带有 SPA ODIC 应用程序的 Okta (SP)。我们决定允许另一个具有 saml2 身份验证的 Okta 组织/客户端访问我们的应用程序。因此,我们设法按照 okta 文档的指南正确地在 2 个 Okta 之间进行了设置。
当我们运行基于 Okta-sign-in-widget 库自托管小部件的应用程序时。应用程序要求用户名来识别要向哪个 Okta 进行身份验证,对于 IDP 用户,应用程序将用户重定向到 IDP 登录页面,然后在完成用户身份验证后,它将用户重定向回反应应用。问题是我无法获得访问令牌,因为两方(SP 和 IDP)没有创建任何 cookie。这意味着我无法对我们的反应应用程序的用户进行身份验证。我可以从 Okta 系统日志中看到用户已成功通过身份验证。
我在反应应用程序上使用的代码来检查用户会话是否已创建或未进行身份验证如下。
try {
const session = yield call(oktaAuth.session.exists);
if (session) {
const response = yield call(oktaAuth.token.getWithoutPrompt);
oktaAuth.tokenManager.setTokens(response.tokens);
}
......
我的 oktaAuth (okta-auth-js) 实例配置是
new OktaAuth({
pkce: false,
issuer: process.env.REACT_APP_OKTA_ISSUER, SP Issuer
clientId: process.env.REACT_APP_OKTA_CLIENT_ID, SP Client ID
redirectUri: window.location.origin + Routes.ROOT + Routes.LOGIN Routes.CALLBACK
})
我的 Okta-sign-in-widget 实例,此配置应该支持来自 SP 的当前 OIDC 流和来自 IDP 的 saml2 流
new OktaSignIn({
features: {
rememberMe: false,
idpDiscovery: IDPEnabled
},
...(IDPEnabled && {
idpDiscovery: {
requestContext
}
}),
i18n: {
en: {
"primaryauth.title": " ",
"primaryauth.submit": "Login"
}
},
colors: {
brand: GREEN
},
authClient: oktaAuth,
baseUrl
});
React okta libs versions
"@okta/okta-auth-js": "^4.6.2",
"@okta/okta-react": "^4.1.0",
"@okta/okta-signin-widget": "^5.7.2",