Backstage自定义Auth Resolver集成Okta时缺失会话Cookie问题
Okta自定义Auth Resolver刷新页面退出问题排查与解决
问题概述
基于Okta实现自定义Auth Resolver后,登录功能正常,但刷新页面时会自动退出并跳转至登录页。此时浏览器发起的刷新请求:
GET http://localhost:7007/api/auth/okta/refresh?optional=&scope=openid email profile offline_access&env=development
返回401未授权,错误信息为:
name: "AuthenticationError", message: "Refresh failed; caused by InputError: Missing session cookie"
且该请求头未携带Cookie。
排查与解决步骤
1. 修正Session Cookie配置
在app-config.yaml的auth节点下补充session cookie的SameSite和Secure属性,确保跨端口请求能携带Cookie:
auth: environment: development providers: okta: development: clientId: ${AUTH_OKTA_CLIENT_ID} clientSecret: ${AUTH_OKTA_CLIENT_SECRET} audience: ${AUTH_OKTA_DOMAIN} session: cookie: sameSite: lax # 开发环境跨端口场景下,lax允许GET请求携带Cookie secure: false # 开发环境使用HTTP时必须设为false,生产环境HTTPS设为true
2. 对齐前后端Provider ID
前端SignInPage配置的provider ID需与后端Okta provider的ID一致,否则会导致session关联失败:
components: { SignInPage: props => { return ( <SignInPage {...props} auto provider={{ id: 'okta', // 改为与后端一致的"okta",而非自定义的"custom-auth-resolver" title: 'Okta', message: 'Sign in using Okta', apiRef: oktaAuthApiRef, }} onSignInSuccess={async (identityApi: IdentityApi) => { props.onSignInSuccess(identityApi); }} /> ); }, },
3. 配置CORS允许携带凭证
若前端与后端使用不同端口,需在app-config.yaml的backend节点开启CORS凭证支持:
backend: cors: origin: http://localhost:3000 # 替换为你的前端实际地址 credentials: true # 允许跨域请求携带Cookie
4. 检查自定义Auth Resolver的Session处理
确认你的customAuthResolver代码中,认证成功后正确生成并返回session cookie,确保Set-Cookie响应头包含正确的参数(与app-config中的session配置一致)。
验证方法
- 修改配置后重启Backstage后端服务
- 重新登录,在浏览器开发者工具的
Application > Cookies中,确认存在Backstage的session cookie,且SameSite为Lax、Secure为false(开发环境) - 刷新页面,观察
/api/auth/okta/refresh请求是否携带Cookie,且返回200状态码
内容的提问来源于stack exchange,提问作者Ferin Patel
相关产品推荐
相关产品推荐

