【问题标题】:How to avoid that AWS Amplify OAuth tries to parse every oauth process如何避免 AWS Amplify OAuth 尝试解析每个 oauth 进程
【发布时间】:2020-01-23 16:23:29
【问题描述】:

我正在使用一个 react-native 应用程序,在该应用程序中我使用 AWS Amplify 和联合登录实现了身份验证流程。这是放大配置:

Auth: {
      identityPoolId: 'XXX',
      region: 'XXX',
      mandatorySignIn: false,
      userPoolId: 'XXX',
      userPoolWebClientId: 'XXX',
      oauth: {
        domain: env.AWS_OAUTH_DOMAIN,
        scope: ['email', 'profile', 'openid','aws.cognito.signin.user.admin', 'given_name', 'family_name', 'user_gender', 'user_birthday', 'user_location'],
        redirectSignIn: myapp://signin,
        redirectSignOut: myapp://logout,
        responseType: 'code',
      },
    },

一切正常。到现在为止。

现在我必须为其他目的添加另一个 OAuth 身份验证(将 Strava 连接到我的应用程序)。一切正常,直到 Strava 授权对话框在 url 处重定向到我的应用程序:runcard://profilo/servizi?code=XXX&scope=activity%3Aread%2Cread(此回调 url 与我为放大配置设置的不同)。一旦重定向,放大就在那里,准备通过 Amplify OAuth 引发异常:

WARN  Possible Unhandled Promise Rejection (id: 0):
TypeError: undefined is not an object (evaluating '_a.accessToken')

我相信由于回调 url 有一个code 参数,Amplify 正在尝试自己完成这项工作。没有成功。

有人遇到同样的问题吗?

【问题讨论】:

  • 你有没有设法解决这个问题?
  • 不是一个真正的解决方案,但我使用了一种解决方法,我会在这里发布。

标签: react-native aws-amplify


【解决方案1】:

我找到了问题的原因!

Amplify 专门在名为 code 的任何深层链接 URL 中寻找一个参数。

我也将 code 用于 oauth 回调(注册确认码)以外的目的。

将参数更改为其他任何值(例如confirmationCode)可防止出现accessToken 错误。

【讨论】:

  • 但是在使用第三方服务时不能更改参数名称,例如问题中的情况(Strava)。
【解决方案2】:

最后,我使用了这个解决方法:我删除了 Amplify 侦听器,并添加了一个仅解析 Amplify OAuth URL 的新侦听器。

Amplify.configure({ ... });
Analytics.getInstance();

// Workaround: this is to avoid that Amplify OAuth try to parse EVERY url as a OAuth callback url
// https://stackoverflow.com/questions/59883011/how-to-avoid-that-aws-amplify-oauth-tries-to-parse-every-oauth-process

Linking.removeAllListeners('url');
Linking.addEventListener('url', (url) => {
  if (url.url.indexOf(AWS_OAUTH_REDIRECT_SIGNIN !== -1 || url.url.indexOf(AWS_OAUTH_REDIRECT_SIGNOUT) !== -1) {
    Amplify.Auth._handleAuthResponse(url.url);
   }
});

AWS_OAUTH_REDIRECT_SIGNIN 和 AWS_OAUTH_REDIRECT_SIGNOUT 与 Amplify 配置中指定的相同:

AWS: {
    Auth: {
      oauth: {
        redirectSignIn: AWS_OAUTH_REDIRECT_SIGNIN,
        redirectSignOut: AWS_OAUTH_REDIRECT_SIGNOUT,
        responseType: 'code'
      }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2019-12-17
    • 1970-01-01
    • 2015-12-25
    • 2018-10-31
    • 2014-07-20
    • 2018-07-07
    • 2015-07-24
    相关资源
    最近更新 更多