Cognito应用客户端默认redirect_uri配置:解决无授权码与redirect_mismatch
AWS Cognito 默认 redirect_uri 自定义配置方案
问题根源
Cognito托管UI默认会把redirect_uri设为/oauth2/idpresponse——这是它处理SAML身份提供商(比如你用的Okta)回调的内置端点,用来完成授权码交换、会话同步等后台逻辑,之后会自动跳转到你的应用页面,但这个过程会把授权码留在/oauth2/idpresponse端点,不会带到最终的应用URL里。
可行解决方案
1. 确认回调URL配置(必做)
先确保你的应用客户端回调URL列表同时包含两个地址:
https://my-domain/oauth2/idpresponsehttps://my-domain/my-app
这个配置是必须的:前者是Cognito与Okta交互的必要端点,删掉会触发redirect_mismatch错误;后者是你需要接收授权码的目标页面。
2. 构造指定redirect_uri的授权请求
不要让用户访问https://my-domain/my-app时直接触发Cognito的默认重定向,而是在应用入口页面添加自动跳转逻辑,直接指向明确指定redirect_uri的Cognito授权URL。
举个前端JS的实现例子:
// 检查当前URL是否已有授权码,没有则跳转到Cognito授权页 if (!window.location.search.includes('code')) { const cognitoDomain = 'https://你的Cognito域名.auth.区域.amazoncognito.com'; const clientId = '你的应用客户端ID'; const targetRedirectUri = 'https://my-domain/my-app'; const scope = 'openid email'; // 根据你的业务需求调整权限范围 // 生成随机state值,防止CSRF攻击,必须加 const state = Math.random().toString(36).slice(2, 18); const authUrl = `${cognitoDomain}/oauth2/authorize?response_type=code&client_id=${clientId}&redirect_uri=${encodeURIComponent(targetRedirectUri)}&scope=${encodeURIComponent(scope)}&state=${state}`; window.location.href = authUrl; }
这样用户访问https://my-domain/my-app时,会自动跳转到带正确redirect_uri的Cognito登录页,认证完成后直接跳回https://my-domain/my-app?code=你需要的授权码。
3. 无前端代码的替代方案(可选)
如果不想在应用里加前端逻辑,可以通过CloudFront配置实现:
- 给你的域名配置CloudFront分发,设置当请求路径为
/my-app时,执行重定向行为,把请求转发到构造好的Cognito授权URL(带上指定的redirect_uri参数)。
重要注意事项
- 永远不要删掉
https://my-domain/oauth2/idpresponse这个回调地址,否则Cognito和Okta的SAML交互会直接失败。 - 授权请求里的
state参数必须加,这是OAuth2的安全规范,用来防范跨站请求伪造攻击。 redirect_uri的路径、大小写必须和应用客户端配置的完全一致,哪怕差一个斜杠都会触发redirect_mismatch错误。
内容的提问来源于stack exchange,提问作者Ebikeneser
相关产品推荐
相关产品推荐

