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 URLSign 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://&lt;your-ALB-DNS&gt;/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://.amazoncognito.com/login?response_type=token&client_id=&redirect_uri=localhost:3000/campaignsList,效果很好。但是,我也需要将它集成到前端。但我面临问题。我的 aws-export.js 的 oauth 为: "oauth": "domain": ,"scope":["phone","email","openid","profile","aws.cognito.signin.user .admin"],"redirectSignIn": "localhost:3000/campaignsList", "redirectSignOut": "localhost:3000/signin", "responseType": "token", "client_id": ,我保持 redirectSignIn 等于我的 cognito 客户端中的 CallBackUrls 和 redirectSignOut 等于注销 URL。另外,在登录页面上我这样做: Auth.configure( awsmobile );拿起配置和登录按钮点击我做: 等待 Auth.federatedSignIn(customProvider: "IdP")。 @AzherAleem 你遇到了什么问题?【参考方案10】:

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

Cakephp 内部从控制器重定向到另一个控制器

从本地驱动器重定向到服务器