在React Native中使用Expo.Google.logInAsync时如何解决“ redirect_uri_mismatch”错误?

时间:2019-01-23 18:57:24

标签: javascript react-native authentication google-signin expo

在我的React Native应用程序(在内置的APK中)调用Expo.Google.logInAsync()之后,我收到错误代码400“ redirect_uri_mismatch”。请注意,在Expo客户端上,我没有收到错误,Google登录页面崩溃了,没有错误。我怀疑错误是在本机端某处记录的。
我正在将Expo 32.0.0与React Native 32.0.0一起使用。
我已按照https://docs.expo.io/versions/v32.0.0/sdk/google/此处列出的说明进行操作,并创建了iOS和Android OAuth客户端ID。
下面是我的代码的副本:

const signInWithGoogleAsync = async () =>  {
    try {
        const result = await Expo.Google.logInAsync({
        androidClientId: ANDROID_CLIENT_ID,
        iosClientId: IOS_CLIENT_ID,
        scopes: ['profile', 'email'],
        });

        if (result.type === 'success') {
        return result.accessToken;
        } else {
        return {cancelled: true};
        }
    } catch(e) {
        console.log(e);
    }
    }

我们将非常感谢您的帮助。
如果您需要其他信息,请告诉我。
谢谢。

4 个答案:

答案 0 :(得分:1)

到目前为止,我只看到了一个临时修复程序。几天来我都遇到了同样的问题,并且由于

  

米歇尔·科姆   谁在这里提供了解决方案->    https://github.com/expo/expo/issues/3540

解决方案

继续使用Expo SDK 32。 按照Google SDK的SDK 31文档中所述,转到Google Developer Console并创建一个Android Oauth2客户端ID和一个iOS Oauth2客户端ID(确保程序包名称为host.exp.exponent)。

按如下所示使用Android客户端ID和iOS客户端ID:

import { Platform } from 'react-native';
export const isAndroid = () => Platform.OS === 'android';

const result = await Google.logInAsync({
    clientId: isAndroid() ? '<YOUR_ANDROID_CLIENT_ID>' : '<YOUR_IOS_CLIENT_ID>',
});

说明 我看到的主要问题是,即使在新文档中也声明了以下内容:

const clientId = '<YOUR_WEB_CLIENT_ID>';

事实是,在内部从Expo应用程序调用了请求,并且可以在错误页面上展开请求详细信息时看到: enter image description here

如您所见,它将添加软件包名称host.exp.exponent。

无论如何,这仅在您处于开发 Expo应用中时有效。如果创建一个独立的应用程序,则需要使用Google登录,这是完全不同的战斗。

答案 1 :(得分:0)

您必须在 app.json 中为您的应用程序提供正确的值,并在 GoogleDeveloper 控制台中创建 cliendID 时指定此值。 app.json 中的 android.package 和 ios.bundleIdentifier 应该有一个像“domain.subdomain1.subdomain2”这样的字符串值。例如 app.json:

"ios": {
  "bundleIdentifier": "com.mydomain.myawsmapp"
  }
"android": {
  "package": "com.mydomain.myawsmapp"
}

答案 2 :(得分:0)

我在 Client IdandroidClientId: ANDROID_CLIENT_ID 中使用相同的 androidStandaloneAppClientId: ANDROID_CLIENT_ID,方法是更改​​其中一个的 client id 对我有用

答案 3 :(得分:0)

如果你想使用 expo go 你应该这样做


  1. 在您的谷歌控制台的 iOS OAuth 客户端 ID 中,您应该:
  • 使用 host.exp.exponent 作为包标识符。
  1. 在您的 Google 控制台的 Android OAuth 客户端 ID 中,您应该:
  • 使用 host.exp.exponent 作为“包名称”。

在您的独立应用中,您应该:

  1. 在您的谷歌控制台的 iOS OAuth 客户端 ID 中,您应该:
  • 如果您还没有 bundleIdentifier,请在您的 app.json 中使用它。
  1. 在您的 Google 控制台的 Android OAuth 客户端 ID 中,您应该:
  • 使用 app.json 中的 android.package(例如:ca.brentvatne.growlerprowler)到 包名称字段。

来源:https://docs.expo.io/versions/latest/sdk/google/#using-it-inside-of-the-expo-app