Flutter - Android intent-filter with Google Oauth

Flutter - Android intent-filter with Google Oauth

我已经使用 Google Oauth 构建了一个 Flutter 应用程序,但是我遇到了 intent-filter 的障碍。

我使用 https://pub.dev/packages/oauth2_client 包登录。

我在 Google Api 控制台中创建了一个 Android 凭据,只给我一个 client_id(在本例中为:'abc')。

我的登录函数是:

GoogleOAuth2Client client = GoogleOAuth2Client(
                                customUriScheme: "my.test.app",
                                redirectUri: "my.test.app://oauth2redirect");

OAuth2Helper oauth2Helper = OAuth2Helper(client,
                                grantType: OAuth2Helper.AUTHORIZATION_CODE,
                                clientId: 'abc',
                                scopes: [
                                  'https://www.googleapis.com/auth/drive.readonly'
                                ]);

var resp = await oauth2Helper.get('https://www.googleapis.com/drive/v3/files');

我将 intent-filter 添加到 main/AndrodiManifest。xml:

<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" >
      <intent-filter android:label="flutter_web_auth">
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <data android:scheme="my.test.app" />
      </intent-filter>
  </activity>

当登录功能是运行时,google说我:“自定义方案不能有权限”。

好吧...我试过 'http://my.test.app/oauth2redirect' -> 重定向 uri 不匹配。 我从 API 控制台下载了 JSON,我看到我的 Android 凭证只有 2 redirect_uri: "urn:ietf:wg:oauth:2.0:oob","http ://本地主机”。这是从哪里来的,我可以在哪里添加更多重定向 uri?

我将 Android 凭据更改为 Web 应用程序,我可以在其中添加自定义重定向 uri。 我在 Web 凭据中添加了一个假地址:“http://my.test.app”。这个证书给我一个 client_id 和一个秘密。

修改了sign_in函数:

GoogleOAuth2Client client = GoogleOAuth2Client(
                                customUriScheme: "my.test.app",
                                redirectUri: "http://my.test.app");

OAuth2Helper oauth2Helper = OAuth2Helper(client,
                                grantType: OAuth2Helper.AUTHORIZATION_CODE,
                                clientId: 'abc2',
                                clientSecret: 'acb3',
                                scopes: [
                                  'https://www.googleapis.com/auth/drive.readonly'
                                ]);

成功:Google 登录正常并重定向到 http://my.test.app,但程序卡住了。浏览器告诉我:“无法访问该站点”并且 Android 应用程序不会拦截响应。为什么??

我认为我的虚假网站不应该存在,不是吗??

我认为重定向 uri 在查询参数中获得授权代码,我的应用程序拦截它并且 oauth2_client 包处理响应。

为什么会卡在浏览器中?

这是一个故意的问题吗?我是不是配置不好?

我找到了解决方案:我必须重定向到客户端 ID 的反向 DNS 概念并且必须使用 Android 凭据(仅适用于 client_id)

就我而言:

android:scheme="com.googleusercontent.apps.XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

customUriScheme="com.googleusercontent.apps.XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
redirectUri: "com.googleusercontent.apps.XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:/"