You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/idpresponse
  • https://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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:35:19