Amazon Cognito:从浏览器重定向到 Android 应用程序时如何停止出现“redirect_mismatch”错误
Posted
技术标签:
【中文标题】Amazon Cognito:从浏览器重定向到 Android 应用程序时如何停止出现“redirect_mismatch”错误【英文标题】:Amazon Cognito: How to stop getting "redirect_mismatch" error when redirecting from browser to Android app 【发布时间】:2018-11-28 21:52:35 【问题描述】:我正在尝试创建一个 android 项目,通过让用户在浏览器中登录到 Amazon Cognito 来授权用户,然后该用户应该重定向回我的应用程序。不幸的是,当浏览器打开时,我没有到达正确的登录页面,而是不断收到此错误:
在我的 AuthenticatorActivity.java 中:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_authenticator);
Uri authzUrl = Uri.parse("https://<myDomain>.auth.us-west-2.amazoncognito.com/login?response_type=token&client_id=<myClientId>&redirect_uri=myapp://mainAct");
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, authzUrl);
startActivity(launchBrowser);
在 AndroidManifest 中:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="mainAct" android:scheme="myapp"></data>
</intent-filter>
</activity>
我无法弄清楚我在这里做错了什么。我错过了一步吗?
【问题讨论】:
你解决过这个问题吗? 在设置回调 URL [您可以定义多个,这就是为什么您需要指定 redirect_uri] 并定义我的登录端点后,我得到了这个工作。 转到 Amazon Cognito 开发人员指南,他们在其中定义了登录终端节点的规范:https://docs.aws.amazon.com/cognito/latest/developerguide/login-endpoint.html 他们在页面底部给出了一个示例。此页面描述了哪些参数是必需的,哪些是可选的。 【参考方案1】:请检查您的回调网址并退出网址。正确的格式是:
app_client_name:https://www.myapp.com/
【讨论】:
所以在您的情况下,app_client_name
将是 alok-besure
?
谢谢。在 Callback URL 和 Sign out URL 中指定一个完整的 URL 对我有用。【参考方案2】:
好的,我在这里留下一个花絮,以供下一个可能找到它的人。我遇到了完全相同的问题,但作为 Cognito 和 IdP/SSO 的新手,我不知道如何解决这个问题。这是我为最终解决此问题所做的工作。我们正在与外部服务集成,我们遇到了这个错误。在 Chrome Developer Tools -> Network 下,我开始记录访问的 URL,然后我再次尝试 SSO 集成。列表中显示了一个 URL,该 URL 通过重定向到 URL 访问了 Cognito。该 URL 必须与 Cognito 的回调 URL 下列出的 URL 相同。
希望这可以为将来节省一些时间。
【讨论】:
简而言之...对 Cognito 端点的请求中的redirect_uri
参数需要匹配在 Cognito 用户池的应用程序客户端设置中找到的“回调 URL”。
我也在为此苦苦挣扎。我正确设置了根目录,但忘记设置路径。所以我有https://192.168.0.101;3000/
,但应该是https://192.168.0.101;3000/userProfile
我只是来这里说我的 oauth 配置中有“localhost:3000”(斜杠)和我的 Cognito 用户池回调 URL 中有“localhost:3000”(没有斜杠).. . 当我让它们都带有斜杠时,这个错误就消失了。
对我来说,aws 上定义的重定向 url 只是“myapp://”。将其更改为“myapp://appname”后,它起作用了。但是感谢开发人员工具的技巧。它帮助我找到了 3 天以来一直困扰的问题。【参考方案3】:
在我的情况下,错误是由于 CloudFront 提供旧文件。
解决它;您可以通过 AWS 控制台使 CloudFront 文件无效。
p.s.可以使用/*
使所有文件无效
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html
【讨论】:
【参考方案4】:假设您的网站位于应用程序负载均衡器 (ALB) 之后,并且您有一个使用 Cognito 用户池的侦听器规则,并且 IF 规则语句中的 Path is *,您应该配置您的 0Auth客户端应用回调地址,如:
https://<your-ALB-DNS>/oauth2/idpresponse
这使它至少对我有用,没有其他花哨的配置。
请记住,这只会在 ALB 背后的所有内容之上提供一层。如果你有一些额外的身份验证方法,你也必须配置它。
【讨论】:
【参考方案5】:我通过记住在前端的 callbackUrl 中包含 http://
解决了这个问题。
const redirect_url=`$window.location.origin`;
这可能不是一个常见的原因,但这就是为什么我的坏了。
【讨论】:
【参考方案6】:我在 cognito 中使用 amplify 并遇到此错误。通过以下修复。在 aws-export.ts 中有一个 redirectSingIn url,它必须与 cognito/app Integration/app client setting/callback url 中的 url 完全相同,这是应用程序运行的位置。
更新: 我在 AWS cognito、用户池、App 客户端、客户端 Web 中再次遇到了这个问题。 更新回调 URL 后,事情开始中断,即使回调 URL 是有效的。后来我发现更改同步需要一些时间。需要离开大约 10 分钟,然后再试一次。
【讨论】:
【参考方案7】:如果您请求范围,您绝对需要确保检查这些项目,否则您会收到 redirect_mismatch
(无用的错误名称)。
使用教程here中的以下配置
Auth.configure(
oauth:
domain: aws.idpDomain,
scope: ['email', 'openid'],
// we need the /autologin step in between to set the cookies properly,
// we don't need that when signing out though
redirectSignIn: aws.redirectSignIn,
redirectSignOut: aws.redirectSignOut,
responseType: 'token',
,
)
【讨论】:
它也适用于 Allowed OAuth Flows 设置为 Authorization code grant 而不是 Implicit grant。【参考方案8】:这是因为redirectSignIn 或redirectSignOut 的url 不匹配。请检查 aws 控制台中的设置和代码 aws_config,并使它们保持一致。
aws console redirect uri configuration
【讨论】:
【参考方案9】:我犯的另一个愚蠢的错误是,aws-exports.js
中的redirectSignIn
的值完全错误。当您通过 Amplify CLI 多次修改此配置的值时,它会附加一个逗号,将该值视为一个列表,从而为您提供类似这样的内容
"redirectSignIn": "http://localhost:3000/,http://localhost:3000/,http://localhost:3000/,http://localhost:3000/",
不幸的是,使用 HostedUI 时,该值被视为字符串。
【讨论】:
哇,你为我节省了这么多时间。谢谢! @Oscar,我也在使用 amplify 来集成基于 SAML 的 IDP。但是,如果我直接访问该 url:https://Dimitris https://***.com/a/60456018/6883773
如果您为负载均衡器指定了 DNS 路由 53。您可以在回调 URL 中指定相同的内容。
https://www.example.com/oauth2/idpresponse
参考:https://aws.amazon.com/premiumsupport/knowledge-center/elb-configure-alb-authentication-idp/
【讨论】:
【参考方案11】:我观看了这个视频“使用 AWS Amplify 为 Web 应用程序添加 Facebook 登录”:https://dev.to/aws/adding-facebook-sign-in-for-web-applications-with-aws-amplify-2fc8
它部署到 localhost,因此我将其部署到 Amplify URL ... 我遇到了相同的重定向错误广告,结果证明我没有更新 src 目录中的 aws-exports.js。
【讨论】:
【参考方案12】:redirect_uri(第一张图片)必须与回调 URL 字段(第二张图片)中的相同。
第一张图片
2nd img(应用集成 -> AWS 下的应用客户端设置)
【讨论】:
以上是关于Amazon Cognito:从浏览器重定向到 Android 应用程序时如何停止出现“redirect_mismatch”错误的主要内容,如果未能解决你的问题,请参考以下文章
从 Android 上的应用内浏览器重定向到 Chrome 的最佳方式?
从浏览器重定向到 Android 应用程序 - 在发布应用程序之前
使用确认 URL 确认 amazon cognito 后如何重定向?
如果已安装,则将用户从 iOS 浏览器重定向到 App,如果未安装,则将用户重定向到 App Store - 像 Yelp