expo-auth-session/providers/google 不适用于独立应用程序:invalid_scheme

Posted

技术标签:

【中文标题】expo-auth-session/providers/google 不适用于独立应用程序:invalid_scheme【英文标题】:expo-auth-session/providers/google not working on standalone app: invalid_scheme 【发布时间】:2021-02-10 01:43:12 【问题描述】:

我希望有人可以帮助我解决我一直在努力解决的以下问题。

我正在尝试在 Expo SDK 39 中在 android 上使用 expo-auth-session/providers/google 进行 Google 身份验证。

我已按照指南 here 进行操作,但我所做的一切都以谷歌消息告终:

错误 400:invalid_request redirect_uri 的参数值无效: 无效方案:com.my_domain.myapp:/oauthredirect

我就是不明白我做错了什么。

我需要提到一个事实,即在 Expo Client 中,登录/注册与完全相同的代码完美配合。

我检查了无数次凭据,令我困扰的是它在 expo 客户端中有效,但在独立应用程序中无效,所以我确信它与 google 配置有关,但我不知道是什么。

这是我的 app.json:


  "expo": 
    ...
    "scheme": "myapp",
    "platforms": [
      "ios",
      "android"
    ],
    ...
    "android": 
      "package": "com.my_domain.myapp",
      ...
    
  

还有我的整合:

import React,  useState  from 'react';
import * as WebBrowser from "expo-web-browser";
import * as Google from 'expo-auth-session/providers/google';
import PillButton from '../UI/PillButton';

const SignupCmp = props => 
    const [browserOpen, setBrowserOpen] = useState(null);

    const [request, response, promptAsync] = Google.useAuthRequest(
        expoClientId: '123-myuniqueid.apps.googleusercontent.com',
        androidClientId: '123-myuniqueid.apps.googleusercontent.com'
    );

    useEffect(() => 
        WebBrowser.warmUpAsync().then(r => console.log('warmed'));

        return () => 
            WebBrowser.coolDownAsync().then(r => console.log('cooled'));
        ;
    , []);

    useEffect(() => 
        if (response?.type === 'success') 
            const  authentication  = response;
            // console.log(authentication);
        
    , [response]);


    const handleBrowserOpen = async (url) => 
        let result = await WebBrowser.openBrowserAsync(url );
        setBrowserOpen(result);
    

    return (
        <View>
            <PillButton
                disabled=!request
                title=I18n.t('authScreens.signupWithGoogle')
                type="solid"
                onPress=() =>  promptAsync().then(async val => 
                  
                  props.googleAuth(val.authentication.accessToken);
                ) 
            />
        </View>
    );
;

export default SignupCmp;

我真的需要这方面的帮助,因为我没有想法。

更新

我更新了 useAuthRequest 中的 redirectUri 属性,如下所示:

const [request, response, promptAsync] = Google.useAuthRequest(
    expoClientId: '123-myuniqueid.apps.googleusercontent.com',
    androidClientId: '1234-myuniqueid.apps.googleusercontent.com',
    redirectUri: AuthSession.makeRedirectUri(
      native: 'myapp:/oauthredirect',
      useProxy: true
    ),
    scopes: [
      'profile',
      'email'
    ]
  , );

现在消息已更改为

Invalid parameter value for redirect_uri: Missing authority: myapp:/oauthredirect

expo 客户端中的登录仍然可以正常工作。

我尝试在 Google 控制台中创建一个新的 API 密钥,并在那里尝试了不同的设置,但似乎没有任何效果。

我真的可以得到一些帮助。 谢谢!

【问题讨论】:

【参考方案1】:

我最终使用import * as GoogleSignIn from 'expo-google-sign-in'; 而不是import * as Google from 'expo-auth-session/providers/google';

看来这是我让它正常工作的唯一方法。

【讨论】:

你是如何在 Expo Client 上为本地开发工作的 @ShalomSam 我没有。我只是在过滤博览会客户:import Constants from 'expo-constants';if (Constants.appOwnership !== 'expo') //whatever 所以在本地开发过程中测试这个的唯一方法就是构建一个 APK....? 是的。或者这是我至少知道的唯一方法

以上是关于expo-auth-session/providers/google 不适用于独立应用程序:invalid_scheme的主要内容,如果未能解决你的问题,请参考以下文章